4

私は非常に単純なアプリを設計しようとしていますが、Hibernateのエンティティオブジェクトと値オブジェクトの定義(Java Persistence with Hibernateの第4章で定義されている)と少し混乱しています。

私が持っているのは、注文できる顧客とのアプリです(1対多の関係)。これらの各注文には、多くの注文明細があります(1対多)。さて、顧客はアイデンティティ(顧客番号)を持っていると思いますが、注文(注文番号)もそうなので、エンティティオブジェクトになりますか?私の混乱は注文ラインにあります。

注文ラインには、数量、製品番号、価格があります。順序線は、その順序なしでは存在できず、それ自体のIDもありません。したがって、私はそれを値オブジェクトと見なします。しかし、注文とその注文ラインの間には1対多の関係があるため、注文ラインを注文テーブルの一部にすることはできません。1対多の関係は、値オブジェクトの定義とどのように連携しますか?Hibernateの本から:

「値型のオブジェクトにはデータベースIDがありません。エンティティインスタンスに属し、その永続状態は所有するエンティティのテーブル行に埋め込まれています。値型には識別子または識別子プロパティがありません。」

誰かが私の混乱を解消することができれば、私は本当にそれをいただければ幸いです:)

4

5 に答える 5

6

Hibernateのドキュメントでは、値オブジェクトではなく、エンティティタイプ値タイプを区別しています。

  • エンティティタイプのオブジェクト:独自のデータベースIDを持っています
  • 値型のオブジェクト:エンティティに属し、その永続的な状態は、所有するエンティティのテーブル行に埋め込まれます。値型には識別子または識別子プロパティがありません。

私が覚えている限り、この本ではaddress、単一の文字列として表されたサンプルとuser、アドレス文字列を含むオブジェクトを使用しています。

  • 値型(通常、データベースレベルで同じテーブル内の列を意味します)として実装され、ユーザーが削除されると、そのアドレスも削除されます。アドレスはユーザーなしでは存続できず、共有できません。

  • エンティティタイプとして実装されると(おそらく別のテーブルを使用することを意味します)、アドレスはユーザーなしでそれ自体で存在し、2人のユーザーが同じアドレスを共有できます。

あなたの場合、注文ラインは注文に属しておらず、その永続的な状態は注文行に埋め込まれていません(意味がありません)、独自のID(orderIdとproductIdで構成されています)を持っています。注文明細は間違いなく値型ではなく、エンティティ型です。

実際、関連付け(1対1、1対多など)の観点から考えるとすぐに、エンティティを確実に操作することになります。

于 2009-11-08T11:50:31.370 に答える
1

あなたが持っているのはかなり一般的なORMの質問だと思います。

あなたは「注文ラインはその注文なしでは存在できず、それ自体のアイデンティティを持たない」と述べました。
OrderLineはOrderと一緒に存在することはできませんが、IDを持つことができないという意味ではありません。

Orderエンティティを取り上げます。顧客なしでは存在できませんが、すでにエンティティと見なされていますね。

したがって、エンティティの提案は次のとおりです。-
顧客(1つ以上のOrderエンティティ
を持つことができます)-Order(1つ以上のOrderLineエンティティを持つことができます)
-OrderLine

于 2009-11-08T10:50:06.603 に答える
1

複合要素を探していると思います。実際にOrderとpurchasedItems(注文明細)を使用する例がリファレンスにあります。Hibernateがスタンドアロンではないと言った場合、それは独自のテーブルを持つことができないという意味ではなく、常に親要素に関連付けられているということです。

<class name="eg.Order" .... >
  ....
  <set name="purchasedItems" table="purchase_items" lazy="true">
    <key column="order_id"/>
    <composite-element class="eg.Purchase">
      <property name="purchaseDate"/>
      <property name="price"/>
      <property name="quantity"/>
      <many-to-one name="item" class="eg.Item"/>
    </composite-element>
  </set>
</class>

From:依存オブジェクトのコレクション

于 2009-11-08T11:59:49.687 に答える
0

値オブジェクトは、同一性が同一性に基づいていない単純なエンティティを表す小さなオブジェクトです。つまり、2つの値オブジェクトは、同じ値を持つ場合は等しく、必ずしも同じオブジェクトである必要はありません。

于 2013-02-19T19:24:25.317 に答える
0

値型と値型は1対1マッピングと1対多マッピングでサポートされているため、順序線を作成できます。明らかに、Javaコレクションは、値型とエンティティの*対多の関係をマッピングするために使用されます。適切なコレクション内では、必要に応じて要素と複合要素が使用され、以下で説明します。エンティティと値型の間の1対多の関係の場合(非JDKタイプ)、複合要素が使用されます。値型テーブルにJDK型の単一の属性(文字列など)が含まれる1対多の関係の場合、要素が使用されます。この概念は、Hibernateを使用したJavaPersistenceの第6章に記載されています。詳細については、このリンク https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/components.htmlを参照してください。

于 2015-12-25T14:18:02.177 に答える