0

我的客户端应用程序是使用 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;
    }
}

我面临的问题是,当我尝试从客户端调用业务方法时(如上所示),我在客户端并且仅在客户端出现了一个巨大且非常难以理解的异常。Glassfish 日志中没有记录异常,实体 ( ) 和潜在链接 ( ) 存储在数据库中。TestLinkEntityTestAppEntity

我在这里粘贴了异常。

以下是我注意到的几件事。

  • 仅当我尝试返回托管实体时才会发生异常。例如,如果我替换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.persistenceeclispelink.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
4

1 回答 1

2

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

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

于 2012-11-07T14:31:06.220 回答