Evite, sempre que possivel, o relacionamento bi-direcional... se não houver necessidade real de mapear, não o faça... a dezenas de problemas implicitos que podem aperecer em mapear um @OneToMany ...
Para mim, o ideal é não mapear, e sempre que precisar saber os elementos desta relação fazer uma consulta simples, ou seja... no lugar de mapear @OneToMany crie uma @NamedQuery para tal função, ai você evita o problema...
a @NamedQuery deve ser colocado no lado @ManyToOne para ficar mais facil de entender
Por exemplo, o relacionamento de estados e pais pode ser mapeado assim
import javax.persistence.*;
@Entity
@NamedQueries({
//...outras NamedQuerys...
/**
* Busca todos os <tt>{@link Estado}s</tt> do {@link Pais} enviado no parametro 1.
*/
@NamedQuery(name = "Estado.allByPais", query = "SELECT OBJECT(o) FROM Estado AS o WHERE o.pais = ?1"),
//.. outras NamedQuerys
})
public class Estado implements Serializable {
//... outra propriedades
@ManyToOne(fetch=EAGER)
private Pais pais;
//... restante das propriedades e métodos
}
import java.util.List;
import javax.persistence.*;
@Entity
public class Pais implements Serializable {
//... pripriedades e métodos de pais
public List<Estado> getEstados(EntityManager em) {
return (List<Estado>)
em.
createNamedQuery("Estado.allByPais").
setParameter(1, this).
getResultList();
}
}
Obs.: a named query que eu coloquei usa EJB QL e não é SQL!! é facil e intuitiva de usar vou colocar dois links abaixo, um com um resuminho, e outro com a syntax:
http://www.dsc.ufcg.edu.br/~jacques/cursos/j2ee/html/ejb/ejbql.htm
http://www.j2ee.me/j2ee/tutorial/1_3-fcs/doc/EJBQL5.html