Java 在返回托管实体的服务器端调用业务方法时,客户端出错
我的客户机应用程序是一个使用Netbeans RCP的独立java应用程序。客户端应用程序连接到安装在Glassfish服务器上的远程EJB 在服务器端,我有一个业务方法(我为测试而设计),它应该获取一个实体的实例(这个实体还没有被持久化或管理),持久化它(使用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
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()
,并且不返回由merge返回的新实体,则永远不会引发异常。e、 g做一些类似于:em.merge
@Override public TestLinkEntity test(TestLinkEntity c) { em.merge(c); return c; }
- 仅当返回的实体包含一对多关系时,才会发生异常。e、 g类似于以下代码段的内容不会引发异常:
TestAppEntity不包含任何关系@Override public TestAppEntity test(TestAppEntity c) { em.persist(c); return c; }
@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