1

注釈が実際にどのように機能するかはよくわかりません。同じクラスで JAXB と JPA (eclipselink を使用) を使用しています。つまり、次のようなクラス定義を取得します。

@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 にないことを意味します)。注釈が互いに干渉するかどうか疑問に思っていますか?

4

2 に答える 2

0

いいえ、そうではありません。

他のすべての注釈を削除し、継承をカットして、非常に単純なクラスになりました。問題が残りました。

私の投稿で言及されていないこと (関係ないと思ったので) は、これを OSGi コンテナー内で実行していることです (それが重要な場合は Felix)。現在、このようなコンテナは異なる「バンドル」を互いにシールドしているため、具体的にパッケージを「エクスポート」するまで、互いのクラスを見ることはできません。

注釈付きのクラスは、persistence.xml とは別のバンドルに含まれていたため、注釈付きのクラスを別のバンドルからインポートして、他の場所で永続化の初期化を行うことができると想定していました。理由はよくわかりませんが、できないことがわかりました。

そのため、JPA を OSGi バンドルと組み合わせて使用​​している場合は、次のことを確認する必要があります。

  • アノテーション付きクラスと persistence.xml は同じバンドルにまとめられています
  • このバンドルは、注釈付きクラスを含むパッケージをエクスポートします
  • 持続性ユニットがバンドルのマニフェスト ファイルにリストされている

その後、さまざまなバンドルで実際の永続化 (EntityManager.persist の呼び出しなど) を行うことができます。

余談ですが、バンドル全体で JAXB アノテーションを使用しようとすると、同様に奇妙なエラーが発生しました。JAXBContext および/または ObjectFactory は、注釈付きクラスを含む同じバンドルでインスタンス化する必要があるようです。私はこれを特定することはできませんでしたが、物事を同じバンドルに入れることは役に立ちました.

OSGi、クラスのロード、および注釈をより深く理解している人が、ここで何が起こっているのかについてコメントしてくれるとうれしいです.

更新: 適切な注釈パッケージをエクスポート/インポートすると、persistence.xml と注釈付きクラスを異なるバンドルに含めることができる場合があります。こちらを参照してください。ただし、テストしていません。

于 2009-06-23T18:12:04.400 に答える