Problema com JPA + toplink no glassfish

3 respostas
L

Pessoal,

Estou com um problema que está me tirando o sono há alguns dias já. Não consigo resolver a seguinte exceção do toplink:
Exception [TOPLINK-7242] (Oracle TopLink Essentials - 2006.8 (Build 060830)): oracle.toplink.essentials.exceptions.ValidationException
Exception Description: An attempt was made to traverse a relationship using indirection that had a null Session. This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization. To avoid this issue, instantiate the LAZY relationship prior to serialization.
Trata-se de uma aplicação jsf que usa JPA e EJB 3.0. O código das entities que representa o relacionamento no banco é esse:

@Entity
class Cliente{

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="cliente")
private List<Pedido> pedidos;
...
}

@Entity
class Pedido{

@ManytoOne
private Cliente cliente;
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="pedido")
private List<ItemPedido> pedidos;
...
}

@Entity
class ItemPedido{
@ManytoOne
private Pedido pedido;
}

Essa exceção está ocorrendo na relação entre Pedido e ItemPedido, quando tento acessar a lista de itens do pedido. Se alguém puder me ajudar ficarei muito agradecido.

3 Respostas

emmanuel.silva

Ola;

Tenho 2 duas dicas:

Implementar java.io.Serializable nas suas entidades
Remova as ligações FetchType.EAGER, para fazer um teste e ver se o problema persiste.

Eu tive problemas com FetchType.EAGER quando a coleção que ele está apontando é uma List, tive que usar Set, mais o Entity Manager que eu estou utilizando é do Hibernate (HibernateEntityManager), mais vale a penas fazer esse teste…

L

Somente para deixar registrado a solução:
Para resolver a questão da indirection eu alterei a interface do EJB de @Remote para @Local, com isso não era mais necessário a serialização e o problema foi resolvido. Mas na verdade acho que o problema principal era o fato de as annotations JPA não estarem distribuídas uniformemente no código das entities. Elas devem ficar todas sobre as declarações das variáveis ou todas sobre os métodos get, e isso não estava ocorrendo. Isso faz com que o provider(no meu caso o TOPLINK) interprete de forma equivocada as annotations.
Obrigado aos que responderam à minha dúvida,
Abraço a todos.

plentz

Por padrão(até onde eu sei) o provider procura pela anotação @Id e verifica se é um atributo ou um getter. A partir dai ele usa essa informação como padrão para aquela classe, ou seja, todas as anotações serão feitas no mesmo lugar (só em atributos ou só em getters).

Criado 4 de maio de 2007
Ultima resposta 13 de mai. de 2007
Respostas 3
Participantes 3