通常、ドメインクラスはJPAアノテーションまたはJAXBアノテーション、あるいはその両方を取得しますか?

StackOverflow https://stackoverflow.com/questions/1820428

  •  10-07-2019
  •  | 
  •  

質問

Webサービスを提供するJavaエンタープライズアプリケーションがあり、ドメインレイヤーと休止状態の永続化レイヤーがあります。この特定のケースでは、ネットワーク経由で送信するオブジェクト、ドメインオブジェクト、および永続化オブジェクトの間に(現時点では)大きな違いはありません。

現在、アプリケーションは永続化側でDTOを使用し、ドメインクラスにJAXB注釈を付けます。しかし、それを読んで考えれば考えるほど、これは逆に思えます! (言うまでもなく、DTOとDomainオブジェクトとの間の心のないやり取りをサポートする多くのコードがあります。)ほとんどのアーキテクトは、ドメインモデルにJPAアノテーションを配置し、ワイヤー経由でオブジェクトを送信するためにDTOを作成することを提案しているようです

私の場合、ドメインクラスにJAXBアノテーションとJPA(Hibernate)アノテーションの両方を配置できますか?

Webサービスファサード、ドメイン、および永続性をすべて緊密にバンドルするという考えは、維持しやすいように思えますが、これらは時間の経過とともに変化する必要があるので心配しています。しかし、Webサービス側のDTOクラスのセットを作成し、永続化側のDTOをスキップする方が賢明でしょうか?

役に立ちましたか?

解決

JPAアノテーションとJAXBアノテーションの両方で同じクラスに注釈を付けないという機能的な理由はありません。ただし、読むのが少し難しくなり、JAXBとJPAで異なるクラス設計のトレードオフが必要になる場合があります。私の経験では、これらのトレードオフは通常、2つのクラスモデルになることを意味します。

他のヒント

同じモデルクラスを使用するのが正しいアプローチであることに同意します。注釈の乱れが気になる場合は、JAXB実装( EclipseLink JAXB )メタデータを外部化するメカニズムを提供します:

また、JPAモデルを使用しているため、EclipseLink JAXB(MOXy)にはこれを簡単にするための拡張機能があります。

これは、JAXBで1つのモデルを使用する例です& RESTfulサービスを作成するJPA:

同じクラスで両方の注釈を使用しても問題ありません。私はこれを奨励する傾向さえあります。なぜなら、変更が発生したときにコピーアンドペーストする必要がないからです。 場合によっては、一部のプロパティの動作が異なります。たとえば、自動生成されたIDをマーシャリングする必要がない場合があります。次に、 @XmlTransient @Transient が結合されます。すべての注釈の意味が明らかなので、読むのは少し難しくなりますが、それほど難しくありません。

あなたが永続ドメインにアトムリンクオブジェクトを配置したいと思った人はいませんか?これを行うのは私には奇妙に思えます。 Hateoasリンクは良いアイデアのように思えますが、永続化されたドメインとサービス実装(Webサービスではありません)は、Atomリンクには関心がありません。繰り返しになりますが、xmlアノテーションを使用して、ジャージーにドメインをシリアル化してもらうと便利です。ただし、このアプローチのもう1つの欠点は、永続ドメイン「レイヤー」を使用して、実行時にWebサービスコンシューマーに簡単に影響を与えることです。リファクタリング。

私はこの質問が少し古いことを知っていますが、これは私が最近出くわした問題であるので、とにかく重量を量るだろうと思いました。スキーマの変更にはこれらのクラスを再生成する必要があるため、JAXB注釈付きクラスはそのままにしておくことをお勧めします。つまり、休止状態の注釈などを手動で再入力する必要があります。これは少し時代遅れのソリューションかもしれませんが、マッピングを外部に格納するために休止状態のマッピングファイル(.hbm.xml)を作成することは完全に合理的だと思います。これはもう少し柔軟性があり、すっきりしていて、私の意見では同じように便利です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top