0

私のクライアント アプリケーションは、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;
    }

}

そして今、1対多の関係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()たとえば、 byを置き換えて、em.mergeマージによって返された新しいエンティティを返さない場合、例外は発生しません。たとえば、次のようにします。

    @Override
    public TestLinkEntity test(TestLinkEntity c) {
        em.merge(c);
        return c;
    }
    
  • 例外は、返されたエンティティに1 対多の関係が含まれている場合にのみ発生します。たとえば、次のコード スニペットのようなものは例外を発生させません。

    @Override
    public TestAppEntity test(TestAppEntity c) {
        em.persist(c);
        return c;
    }
    

    TestAppEntity には関係が含まれていません。

私が確信していること:

  • TestAppEntityクライアント側とTestLinkEntityサーバー側の両方で同じです。

編集:

@Jamesの回答により、eclispelink.jarとjavaee.jarのパッケージの違いは何なのか疑問に思っていますjavax.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
4

1 に答える 1

2

使用している CORBA シリアライゼーションのバグのようです。

私の推測では、クライアントに eclipseLink.jar がありませんが、必要です。データベースから読み込まれたオブジェクトには、特別な LAZY コレクション インスタンスが含まれます。

于 2012-11-07T14:31:06.220 に答える