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