私のクライアント アプリケーションは、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 ログに記録された例外はなく、エンティティ ( ) と潜在的なリンク ( ) がデータベースに保存されます。TestLinkEntity
TestAppEntity
ここに例外を貼り付けました。
ここに私が気づいたことがいくつかあります。
例外は、管理対象エンティティを返そうとしたときにのみ発生します。
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