Bom dia galera.
Estou passando por um problema usando JPA (através do Hibernate) .
Procurei por aí mas não achei nada que pudesse me ajudar, uma vez que é difícil encontrar tags para esse prob.
Enfim, esclarecerei o cenário antes de expor o problema.
Supondo que eu tenha as seguintes entidades(ps: todas são serializaveis):
public class A {
@Id
@Column(name = "id_a");
private long codigo;
@ManyToMany
@JoinTable(name = "A_B, joinColumns = @JoinColumn(name = "id_a"), inverseJoinColumns = @JoinColumn(name = "id_b"))
private Set<B> bs;
...
}
public class B{
@Id
@Column(name="id_b"
private long codigo;
....
}
OK, beleza.
Se eu fizer a persistencia de A que contenha uma coleção de B funciona perfeitamente.
PORRÉÉÉÉÉÉMM cai em uma situação onde o analista de banco decidiu que eu teria uma outra entidade C que possui uma chave composta para a entidade de relacionamento das entidades acima, a A_B.
Como estou usando JPA fui obrigado a mapear também essa entidade de relacionamento, ficando assim:
public class A_B{
@Id
@ManyToOne
@JoinColumn(name = "id_a")
private A a;
@Id
@ManyToOne
@JoinColumn(name = "id_b")
private B b;
}
public class C{
@Id
@Column(ame="id_c")
private long codigo;
@ManyToOne
@JoinColumns( {
@JoinColumn(name = "id_a", referencedColumnName = "id_a"),
@JoinColumn(name = "id_b", referencedColumnName = "id_b") })
private A_B ab;
}
Bom, esse mapeamento funcionou também nos cenários:
1- Quando eu faço a persistencia de A e B ele persiste perfeitamente.
2- Quando persisto C onde o relacionamento A e B já exista, ele também funciona
PORÉM quando persisto no mesmo método os registros de A e B, criando automaticamente o registro na tabela de relacionamento A_B e vou persistir C da sempre um erro dizendo que não existe o relacionamento A_B, porém acabei de cria-lo logo acima no mesmo método.
Compreendem?
Agora se eu fizer essa persistência em chamadas separadas, tudo funciona perfeitamente!
Lembrando que estou usando Hibernate 3.5, Glassfish V3, EJB 3.x, JDK 1.6_u20, Fedora… e postgres 8.4.
Já tentei usar o em.flush() logo depois de criar o relacionamento A_B e antes de tentar persistir C. (‘em’ é meu entitymanager injetado pelo conteiner jee no meu stateless session bean);
O que to entendendo é que quando crio o relacionamento A_B ele fica no cache do hibernate (na minha transação) e ao tentar finalizar o método ele executa as querys de persistencia de C mas que dependem de A_B, daí a dita Exception.
Não questionem os relacionamentos, foi uma decisão dos analistas de banco e faz todo o sentido no contexto em que estamos inseridos. Preferi não postar o código por questões de privacidade da empresa, não seria ético exibi-los por aqui (não nesse contexto).
Help?
Obrigado pessoal!