6

1 対多の関係を使用して関連付けられた 2 つのテーブルがあります。

私は hibernate を使用しています : と私の休止状態のマッピング ファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping default-lazy="false">
 <class catalog="moi"
  name="com.ebla.moi.correspondence.model.entity.user.User" table="user">
  <id name="id" type="java.lang.Long">
   <column name="id"/>
   <generator class="identity"/>
  </id>
  <many-to-one
   class="com.ebla.moi.correspondence.model.entity.department.Department"
   fetch="select" name="department">
   <column name="department_id"/>
  </many-to-one>
  <property generated="never" lazy="false" name="name" type="java.lang.String">
   <column length="128" name="name" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="email" type="java.lang.String">
   <column length="128" name="email" not-null="true" unique="true"/>
  </property>
  <property generated="never" lazy="false" name="maritalStatus" type="java.lang.Short">
   <column name="marital_status" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="hireDate" type="java.lang.String">
   <column length="64" name="hire_date"/>
  </property>
 </class>
</hibernate-mapping>

2 番目のマッピング ファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping default-lazy="false">
 <class catalog="moi"
  name="com.ebla.moi.correspondence.model.entity.department.Department" table="department">
  <id name="id" type="java.lang.Long">
   <column name="id"/>
   <generator class="identity"/>
  </id>
  <property generated="never" lazy="false" name="name" type="java.lang.String">
   <column length="256" name="name" unique="true"/>
  </property>
  <set inverse="true" name="users" sort="unsorted">
   <key>
    <column name="department_id"/>
   </key>
   <one-to-many class="com.ebla.moi.correspondence.model.entity.user.User"/>
  </set>
 </class>
</hibernate-mapping>

私の問題は次のとおりです。従業員とその部門を取得する必要がある場合もあれば、部門情報なしで従業員情報のみが必要な場合もあります.....そして、部門と従業員の同じこと....上記のマッピングファイルを使用して休止状態は部門をもたらし、従業員が必要かどうかはユーザーです...必要なものだけを取得するために休止状態にする必要があることを定義する方法...

ありがとうございました

4

4 に答える 4

10

リレーションを「遅延」としてマッピングし、2 つのクエリを記述してデータを取得できます。

  • データを取得するための通常の単純なクエリ (「遅延」)。例: 「select e from Employee e where ...」

  • 「fetch join」を使用してHibernateに「子」を強制的にフェッチさせる同じクエリ。例: 「select e from Employee left join fetch e.department where ...」

LLP アンドレア

于 2009-02-02T11:44:35.523 に答える
8

ICriteria を使用して従業員を取得できます。

ICriteria の SetFetchMode メソッドを使用して、Department をフェッチするかどうかを決定できます。

これにより、Department が取得されないことが保証されます。

ICriteria crit = theSession.CreateCriteria (typeof(Employee));
crit.SetFetchMode ("Department", FetchMode.Lazy)

このコードでは、部門が取得されます。

ICriteria crit = theSession.CreateCriteria (typeof(Employee));
crit.SetFetchMode ("Department", FetchMode.Join)

マッピングでデフォルトの fetchmode を使用するのがベスト プラクティスであると言う人もいますが (これは怠惰だと思います)、すべての特定のシナリオで fetch-mode を指定します。(つまり、リポジトリ内)。

于 2009-02-02T11:52:04.963 に答える
2

これを行う 1 つの方法は、従業員を表す 2 つのクラスを用意することです。

  • Employee部門情報がマップされています。
  • EmployeeSummary従業員データ自体しかありません。

両方のクラスは、テーブルへの独立したバインディングを持ちますが、定義済みの関係employeeのみを持ちます。Employeedepartment

次に、すべての情報が必要な場合はEmployeeインスタンスをロードし、従業員情報だけが必要な場合はEmployeeSummaryインスタンスをロードします。

AbstractEmployee両方の従業員クラスに共通のスーパークラス like を導入することで、ORM バインディングとビジネス ロジックの重複を取り除くことができます。

于 2009-02-02T12:21:29.053 に答える
1

あなたが探しているのはfetch profilesだと思います 。この例も見てください: http://arjan-tijms.omnifaces.org/2012/04/fetching-arbitrary-object-graphs-in-jpa.html

于 2012-10-26T05:41:15.613 に答える