2 entidades "distintas" na mesma tela jsp

Tenho uma jsp que precisa destes campos:

terminal Id, game, status math Model e por ai vai.

terminal id e game resolvi com um Join.

@Entity
@Table(name = "machine_id")
public class Machine {
	@Id
	private int id;
	@ManyToOne
	@JoinColumn(name = "game", referencedColumnName = "id")
	private Game game;
	@Column(name = "mac_address")
	private String macAddress;
	@Column(name = "math_rules")
	private int mathRules;
	@Column(name = "is_locked")
	private int isLocked;

Criei depois o model do game

@Entity
@Table(name = "games")
public class Game {
	@Id
	private int id;
	private String title;

blz. Mas Status não esta na entidade Machine.

tenho duas tabelas referentes a este dado.

machine_status e status

a status tem id e name. ex.

0 offline
1 Online
2 conflict

ja na machine_Status tem id, status ou seja. id é o id da machine. e status é o id do status la na tabela de status.

Como fazer esse link agora? lembrando que, eu nao tenho Status no model Machine.

De acordo com o modelo, uma Machine pode ter mais de um Status. Você precisa apresentar todos os status de Machine na tela?

isso. preciso do nome do status. porem, esse status nao é mostrado em Machine. e sim em Machine_Status

entendeu o rolo?

se fosse dentro de Machine estava tranquilo. Eu preciso pegar o id de Machine, verificar em Machine_Status com aquele id, para pegar o status e verificar com esse status o name.

Mas como machine pode ter mais de um status, você precisa mostrar um desses status na tela ou todos que tiver cadastrado para a machine?

nunca vai aparecer + de 1. na tabela de machine_status ele controla pelo id da machine.

Se machine terá apenas 1 status, pq não coloca o status em machine?

sim, é o mais obvio.

Mas não posso alterar a estrutura do banco.

colocar Status dentro de Machine vai ocasionar um alter table nao vai?

e eu preciso fazer nessa estrutura, porque outros sistemas estao usando esse banco de dados.

Crie um atributo Status na classe Machine, e marque-o com @Transient, e, depois de pesquisar a Machine, recupere o status dessa machine pelo ID e atribua nesse atributo.

@Entity
@Table(name = "machine_id")
public class Machine {
@Id
private int id;
@ManyToOne
@JoinColumn(name = "game", referencedColumnName = "id")
private Game game;
@Column(name = "mac_address")
private String macAddress;
@Column(name = "math_rules")
private int mathRules;
@Column(name = "is_locked")
private int isLocked;
@Transient
@JoinColumn(name = "status", referencedColumnName = "id")
private MachineStatus status;```

?? esta correto até aqui?

machine Status

public class MachineStatus {
private int id;
@JoinColumn(name = "status", referencedColumnName = "id")
private Status status;```

status

ublic class Status {

private int id;
private String name;
@Entity
@Table(name = "machine_id")
public class Machine {
	
	@Transient // o transient serve para que esse atributo não seja utilizado nas consultas feitas pelo framework ORM
	private Status status;

Ao consulta uma Machine, recupere o status e atribua, assim:

Machine machine = // recupera o machine do banco de dados
Status status = // recupera o status através do id da machine
machine.setStatus = status;

return machine;

Com isso, você conseguirá apresentar o status na tela.

Como que tá o mapeamento entre machine, machine_status e status? Quais as colunas de cada tabela e quais são foreign key de qual?

machine_id

id,game,mac_address,math_rules,is_locked
todas sao primary

machine_status

id,status,ip,last_update
todas primary

status
id,name
todos primary

nao acho que tenha algum relacionamento entre as tabelas. estou no php myadmin, tem como verificar isso?

mas a regra é.

o id de status é o status de machine_status

o id de machine_status é o id de machine id

nao tem como criar tudo pelo model? ou tem que ser no for mesmo?

fiz dessa seguinte forma.

	public ModelAndView index() {

		ArrayList<MachineTo> machinesTo = new ArrayList<MachineTo>();
		
		List<Machine> machines = machineDao.listar();
		
		for (Machine machine : machines) {
			MachineStatus machineStatus = machineStatusDao.getMachineStatus(machine);
			Status status = statusDao.getStatus(machineStatus);
			machine.setStatus(status);
		}```

esse é no controller para retornar o conteudo para a jsp.

e esses sao os daos

```@Repository
@Transactional
public class MachineStatusDao {
	@PersistenceContext
	private EntityManager manager;
	
	public MachineStatus getMachineStatus(Machine machine){
		MachineStatus machineStatus = manager.createQuery("Select p from "+MachineStatus.class.getName()+" p where id="+machine.getId(),MachineStatus.class).getSingleResult();
		return machineStatus;
	}```
```@Repository
@Transactional
public class StatusDao {
	@PersistenceContext
	private EntityManager manager;
	
	public Status getStatus(MachineStatus machineStatus){
		Status status = manager.createQuery("Select p from "+Status.class.getName()+" p where id="+machineStatus.getId(),Status.class).getSingleResult();
		return status;
	}
}```
esta correto do modo como pensei?

estou fazendo o where certo?

me retornou isso

Aug 02, 2016 4:08:54 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/PosReport] threw exception [Request processing failed; nested exception is javax.persistence.NoResultException: No entity found for query] with root cause javax.persistence.NoResultException: No entity found for query

funcionou! eu estava pegando status usando id da machineStatus. Mas o correto é o status da machineId

QUE ROLO! rs mas deu certo. vlw