我的客户端应用程序是使用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;
}
}
我面临的问题是当我尝试从客户端调用业务方法时(如上所示)我在客户端获得了巨大的和非常难以理解的异常而仅< / strong>在客户端。 Glassfish日志上没有记录异常,实体(TestLinkEntity
)和潜在链接(TestAppEntity
)存储在数据库中。
我粘贴了例外here。
以下是我注意到的一些事情。
只有在我尝试返回托管实体时才会发生异常。如果我将em.persist()
替换为em.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的回答,我现在想知道eclispelink.jar和javaee.jar中的包javax.persistence
之间有什么区别。我应该包括两者吗?
包括两个原因造成的麻烦(可能是因为两个罐子中的包装名称相同)。
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
答案 0 :(得分:2)
这似乎是您正在使用的CORBA序列化中的一些错误。
我的猜测是你的客户端上没有eclipseLink.jar,但你需要它。从数据库中读取的对象将包含特殊的LAZY集合实例。