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

时间:2012-11-07 10:23:36

标签: java jpa glassfish ejb eclipselink

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

在服务器端,我有一个业务方法(我用于测试),该方法应该接受一个实体的实例(该实体尚未持久化或管理),保留它(使用persitEntityManager)。

以下是此方法的样子:

@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不包含任何关系。

我确定的事情:

  • TestAppEntityTestLinkEntity在客户端和服务器端都是相同的。

修改

由于@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

1 个答案:

答案 0 :(得分:2)

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

我的猜测是你的客户端上没有eclipseLink.jar,但你需要它。从数据库中读取的对象将包含特殊的LAZY集合实例。