複数のプロセッサのアノテーションを Java クラスに追加できますか?
-
06-07-2019 - |
質問
注釈が実際にどのように機能するかはよくわかりません。私は同じクラスで JAXB と JPA (eclipselink を使用) を使用しています。e.次のようなクラス定義を取得します。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Channel")
@Entity
public class Channel extends NamedEntity {
@XmlAttribute
@XmlSchemaType(name = "anyURI")
@Column(name="url")
protected String url;
@XmlAttribute
@Column
protected String coDirection;
// etc...
}
今、奇妙なエラーが発生しています(たとえば、「com.econemon.suite.common.models.Channel@115c974 は既知のエンティティタイプではありません」。これは通常、クラスがpersistence.xmlにないことを意味します)。注釈が相互に干渉するかどうか疑問に思っていますか?
解決
注釈は、他の注釈、特に干渉できません。が異なるパッケージに由来し、異なる名前を持っている場合ではありません。各フレームワーク(JAXBおよびHibernate)には独自の注釈があります。各フレームワークは、独自の注釈のみを内省します。ここでは問題ではないと確信しています。
エンティティがあるかどうか確認してください:
a)引数コンストラクターなし(デフォルトのコンストラクターでも構いませんが、引数を持つコンストラクターのみがある場合は、JPAに引数なしのコンストラクターを提供する必要があります。これは保護するかパッケージを表示できます。...)
b)フィールドまたはゲッターの@Idアノテーション(常にフィールドベースのアノテーションを使用します。そうでない場合は、タイプ内でJPAゲッターアノテーションとフィールドアノテーションを混在させないでください!)
c)タイプは永続性ユニットにあり、永続性ユニットが使用されている
d)型に@Entityアノテーションがあります
継承を使用する(NamedEntityを拡張する)場合、これをマッピングする方法について、より多くのJPAにより多くの情報を提供する必要があります。最初に、拡張NamedEntityのものを削除しようとします。そして、継承バリアントを説明する優れたJPAチュートリアルをご覧ください。
他のヒント
いいえ、そうではありません。
他のすべてのアノテーションを削除し、継承をカットした結果、非常に単純なクラスが完成しました。問題が残った。
私の投稿では言及されていませんでしたが (関係ないと思ったため)、これを OSGi コンテナー (重要な場合は Felix) 内で実行しているということです。現在、このようなコンテナーはさまざまな「バンドル」を相互に保護するため、パッケージを具体的に「エクスポート」するまでは、相互のクラスを見ることができません。
注釈付きクラスは私のpersistence.xmlとは別のバンドルに存在していたので、別のバンドルから注釈付きクラスをインポートして、永続性の初期化作業を別の場所で実行できると考えていました。結局のところ、できないことがわかりましたが、理由はよくわかりません。
したがって、JPA を OSGi バンドルと組み合わせて使用している場合は、次のことを確認する必要があります。
- 注釈付きクラスとpersistence.xmlは同じバンドルに一緒に含まれています
- このバンドルは、注釈付きクラスを含むパッケージをエクスポートします
- 永続性ユニットはバンドルのマニフェスト ファイルにリストされています
その後、別のバンドルで実際の永続化処理 (EntityManager.persist の呼び出しなど) を実行できます。
余談ですが、私は 同様に奇妙なエラー バンドル間で JAXB アノテーションを使用しようとする場合。JAXBContext および/または ObjectFactory は、アノテーション付きクラスを含む同じバンドル内でインスタンス化する必要があるようです。これを正確に特定することはできませんでしたが、同じバンドルにまとめることは役に立ちました。
OSGi、クラスローディング、アノテーションをより深く理解している人が、ここで何が起こっているのかについてコメントしてもらえれば幸いです。
アップデート:適切なアノテーション パッケージをエクスポート/インポートすると、persistence.xml とアノテーション付きクラスを別のバンドルに含めることができる場合があります。 ここ. 。テストはしていないけど。