Java 在返回托管实体的服务器端调用业务方法时,客户端出错

Java 在返回托管实体的服务器端调用业务方法时,客户端出错,java,jpa,glassfish,ejb,eclipselink,Java,Jpa,Glassfish,Ejb,Eclipselink,我的客户机应用程序是一个使用Netbeans RCP的独立java应用程序。客户端应用程序连接到安装在Glassfish服务器上的远程EJB 在服务器端,我有一个业务方法(我为测试而设计),它应该获取一个实体的实例(这个实体还没有被持久化或管理),持久化它(使用EntityManager的persit) 以下是此方法的外观: @Override public TestLinkEntity test(TestLinkEntity c) { em.persist(c); return

我的客户机应用程序是一个使用Netbeans RCP的独立java应用程序。客户端应用程序连接到安装在Glassfish服务器上的远程EJB

在服务器端,我有一个业务方法(我为测试而设计),它应该获取一个实体的实例(这个实体还没有被持久化或管理),持久化它(使用
EntityManager
persit

以下是此方法的外观:

@Override
public TestLinkEntity test(TestLinkEntity c) {
    em.persist(c);
    return c;
}
从客户端调用,如下所示:

TestLinkEntity c = remote.test(new TestLinkEntity());
以下是
TestLinkEntity
声明:

@Entity
public class TestLinkEntity implements AltEntity, Serializable {

    private Set<TestAppEntity> links = new HashSet<TestAppEntity>();

    @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<TestAppEntity> getLinks() {
        return links;
    }

}
我所面临的问题是,当我试图从客户端调用业务方法时(如上所示),我在客户端得到一个巨大且不可读的异常,而在客户端只有一个。Glassfish日志中没有记录异常,实体(
TestLinkEntity
)和潜在链接(
TestAppEntity
)存储在数据库中

我粘贴了例外情况

以下是我注意到的几件事

  • 只有在尝试返回托管实体时才会发生异常。例如,如果我将
    em.persist()
    替换为
    em.merge
    ,并且不返回由merge返回的新实体,则永远不会引发异常。e、 g做一些类似于:

    @Override
    public TestLinkEntity test(TestLinkEntity c) {
        em.merge(c);
        return c;
    }
    
  • 仅当返回的实体包含一对多关系时,才会发生异常。e、 g类似于以下代码段的内容不会引发异常:

    @Override
    public TestAppEntity test(TestAppEntity c) {
        em.persist(c);
        return c;
    }
    
    TestAppEntity不包含任何关系

  • @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;
        }
    }
    
我可以肯定的是:

  • TestAppEntity
    TestLinkEntity
    在客户端和服务器端都是相同的

编辑:

由于@James的回答,我现在想知道eclispelink.jar中的包
javax.persistence
和javaee.jar中的包有什么区别。我应该把两者都包括在内吗

包括这两个会引起麻烦(可能是因为两个JAR中的包名称相同)


这似乎是您正在使用的CORBA序列化中的一些错误


我猜你的客户机上没有eclipseLink.jar,但你需要它。因为从数据库读取的对象将包含特殊的惰性集合实例。

Hum。我的客户端上已经有一个javaee.jar,它包含javax.persistence包,就像eclipselink.jar一样,添加这两个jar也会带来麻烦。我在客户端添加了以下jar:eclipselink.jar,eclipselink-modelgen_2.4.1[…]jar,javax.persistence*,来自最新的eclipselink安装程序。问题依然存在。服务器端和客户端的版本不同是否重要?我在服务器上使用的是2.3.2。好的,我知道Libraries在客户端和服务器上都是相同的,但它没有改变任何东西。如果您的客户端上已经有了与服务器上相同的javax.persistence类,那么您不需要两个JAR,您需要的是服务器上使用的eclipselink JAR的相同版本,Glassfish使用OSGi捆绑包org.eclipse.persistence…,使用相同的JAR。我也可能是编织的问题,因此您可以在服务器中禁用编织来测试这一点。但是您显示的堆栈跟踪不是来自编织,这是因为您在客户机上没有类。
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