我的客户端应用程序是使用 Netbeans RCP 的独立 Java 应用程序。客户端应用程序连接到安装在 Glassfish 服务器上的远程 EJB。
在服务器端,我有一个业务方法(我为测试而做的),它应该采用一个实体的实例(这个实体还没有被持久化或管理),持久化它(使用persit
的EntityManager
)。
下面是这个方法的样子:
@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;
}
}
现在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;
}
}
我面临的问题是,当我尝试从客户端调用业务方法时(如上所示),我在客户端并且仅在客户端出现了一个巨大且非常难以理解的异常。Glassfish 日志中没有记录异常,实体 ( ) 和潜在链接 ( ) 存储在数据库中。TestLinkEntity
TestAppEntity
我在这里粘贴了异常。
以下是我注意到的几件事。
仅当我尝试返回托管实体时才会发生异常。例如,如果我替换
em.persist()
byem.merge
并且不返回由 merge 返回的新实体,则永远不会引发异常。例如做类似的事情:@Override public TestLinkEntity test(TestLinkEntity c) { em.merge(c); return c; }
仅当返回的实体包含一对多关系时才会发生异常。例如,类似以下代码片段的内容不会引发异常:
@Override public TestAppEntity test(TestAppEntity c) { em.persist(c); return c; }
TestAppEntity 不包含任何关系。
我确定的事情:
TestAppEntity
并且TestLinkEntity
在客户端和服务器端都是相同的。
编辑:
由于@James 的回答,我现在想知道javax.persistence
eclispelink.jar 和 javaee.jar 中的包有什么区别。我应该包括两者吗?
包含两者都会引起麻烦(可能是由于两个 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