2017-09-14 13 views
2

DDDに従ってエンティティであるクラスがあり、@javax.persistence.Entity注釈を持つクラスがあります。彼らは同じクラスでなければなりませんか? JPAエンティティは、マッパー(https://martinfowler.com/eaaCatalog/dataMapper.html)がDDDエンティティをデータベースからロードして格納し、ドメインモデル外に保管するためのメカニズムと同じように機能する必要がありますか?JPAエンティティとDDDエンティティは同じクラスであるべきですか?

データベースのメタデータが分離され、外部(XMLなど)に格納されている場合は違いがありますか?そのようなクラスがエンティティの場合、境界はどこですか? XSD(JAXBなど)やMyBatis Generatorを使用したデータベースから生成されたクラスは、DDDで理解されているエンティティではないと思います。

答えて

2

これは実際の実装の詳細です。彼らはあなたのORMの柔軟性に依存することはできません。例えば、あなたのORMがパーシステンスの問題でそれらを汚染することなくあなたのドメインオブジェクトをマッピングすることを許すならば、それはより少ないオーバヘッドを必要とするアプローチです。

一方、ORMの柔軟性が十分でない場合は、ARとその状態が2つの異なるクラスで、簡単にマップできる簡単な状態クラスが存在する、実用的なハイブリッドアプローチに進むことができます。 ARは依然としてその状態を保護する責任があり、状態オブジェクトはARの外部から直接アクセスされないことに注意してください。このアプローチはVaughn Vernon hereによって記述されています。

+0

あなたの素晴らしい答えをありがとう! 'AR' =='集約ルート '、そうです。私はまだVVの本を読んでいない。したがって、JPAエンティティがARの背後に隠れている単純なDTOとして扱われるならば、それは大丈夫です。そのような場合、同じグラフのDTOに対して複数のARクラスを持たないのでしょうか? –

0

JPAエンティティはドメインエンティティである必要があります。どうして? あなたのドメインエンティティは、いくつかの強い制約を表現する必要があります。

  • 持つパラメータ化コンストラクタ
  • によって書き込み操作

可能な場合に

  • が検証を行い、すべてのセッターを露出していない、ドメインエンティティは、常に有効なビジネスエンティティのままであるべきです。 何らかのマッパーを導入することで、自動的にドメインエンティティに任意のものを書き込むことができます。これにより、基本的に制約が無駄になります。

    もう1つのオプションは、冗長性を導入するJPAおよびドメインエンティティに同じ制約を適用することです。

    あなたの最善の策は、JPAエンティティを可能な限りORMに依存しないようにすることです。 Hibernateを使用して、これは構成クラスまたはXMLファイルを使用して行うことができます。しかし、私はJava EE/JPAの人ではないので、良い実装アドバイスをするのは難しいです。

  • 関連する問題