Erro no lado do cliente ao chamar um método de negócios na entidade gerenciada de retorno do lado do servidor

Meu aplicativo cliente é um aplicativo Java independente usando o NetBeans RCP. O aplicativo cliente se conecta a um EJB remoto montado em um servidor Glassfish.

No lado do servidor, eu tenho um método de negócios (feito para teste) que deveria ter uma instância de uma entidade (essa entidade não é persistida ou gerenciada ainda), persisti-la (usando o persit do EntityManager ).

Aqui está como esse método se parece:

 @Override public TestLinkEntity test(TestLinkEntity c) { em.persist(c); return c; } 

Chamado do lado do cliente assim:

 TestLinkEntity c = remote.test(new TestLinkEntity()); 

Aqui está a declaração TestLinkEntity :

 @Entity public class TestLinkEntity implements AltEntity, Serializable { private Set links = new HashSet(); @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Override public Long getId() { return id; } public void setId(Long id) { this.id = id; } @OneToMany(mappedBy="links") public Set getLinks() { return links; } } 

E agora o TestAppEntity usado no relacionamento um para muitos .

 @Entity public class TestAppEntity implements Serializable, AltEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String test; public TestAppEntity() { } @Override public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTest() { return test; } public void setTest(String test) { this.test = test; } } 

O problema que estou enfrentando é quando eu tento chamar o método de negócio do cliente (como mostrado acima) eu recebo uma exceção enorme e bastante ilegível no lado do cliente e apenas no lado do cliente. Nenhuma exceção registrada nos logs do Glassfish e a entidade ( TestLinkEntity ) e os links em potencial ( TestAppEntity ) são armazenados na base de dados.

Eu colei a exceção aqui .

Aqui estão algumas coisas que eu notei.

  • A exceção só acontece quando eu tento retornar uma entidade gerenciada. Se eu replace o em.persist() por em.merge e não retornar a nova entidade retornada pela mesclagem, por exemplo, a exceção nunca será aumentada. por exemplo, faça algo como:

     @Override public TestLinkEntity test(TestLinkEntity c) { em.merge(c); return c; } 
  • A exceção ocorre apenas quando a entidade retornada contém o relacionamento um para muitos . por exemplo, algo como o trecho de código a seguir não levantará uma exceção:

     @Override public TestAppEntity test(TestAppEntity c) { em.persist(c); return c; } 

    TestAppEntity não contém nenhum relacionamento.

Coisas que tenho certeza:

  • TestAppEntity e TestLinkEntity são iguais nos lados do cliente e do servidor.

EDITAR:

Devido à resposta do @James, agora estou me perguntando qual é a diferença entre o pacote javax.persistence no eclispelink.jar e no javaee.jar. Devo include os dois?

Incluindo ambos causam problemas (talvez devido ao fato de que o nome do pacote em ambos os flasks é o mesmo).

 error: in class file javax/persistence/NamedQuery.class(javax/persistence:NamedQuery.class): unknown enum constant javax.persistence.LockModeType.NONE Note: Attempting to workaround javac bug #6512707 warning: No processor claimed any of these annotations: [javax.ejb.Remote] error: in class file j javax/persistence/NamedQuery.class(javax/persistence:NamedQuery.class): unknown enum constant javax.persistence.LockModeType.NONE