1

Spring3.0.5でHibernate3.6を使用しています。

Userオブジェクトに対して次のマッピングがあります

<class name="foo.User" table="FOO_USER">
    <id  column="USER_ID" name="id" type="java.lang.Integer">
        <generator class="identity"/>
    </id>


    <property name="firstName" column="FIRST_NAME" type="java.lang.String" length="100"/>
    ...
    <many-to-one name="organization" column="ORGANIZATION_ID class="foo.Organization" not-null="true" update="false" />
    ...

ユーザーは組織と多対1の関係にあります。通常、私はその関係を熱心にロードしたいので、マッピングはデフォルト設定のlazy = false(何も指定しないことによる)のままです。

組織を熱心にロードしたくない場合があります。基準でこれを指定してみました

(User)getSession().createCriteria(User.class)
            .add(Restrictions.eq("id",id))
            .setFetchMode("organization", FetchMode.SELECT)
            .uniqueResult();

ただし、フェッチモードは無視されます。Hibernateは依然として組織の関係を熱心にロードします。私はこれに対して頭を数時間ノックしてきました。どんな助けでもいただければ幸いです。

4

2 に答える 2

3

アソシエーションをレイジーとしてマップしたままにし、フェッチ戦略を使用してパフォーマンスを調整することをお勧めします。何かを怠惰なものとしてマッピングし、特定のインスタンスでそれを怠惰でないものにする方法があるとは思いません。確かに、fetch = selectはそれを行いません。それは、怠惰について何も意味しないからです。概念の説明については、リファレンスマニュアルの「パフォーマンスの向上」のセクション21.1を参照してください。

于 2011-08-16T22:55:58.503 に答える
1

FetchType は、fetchProfiles を使用してプログラムで設定できます。

例: Employee クラスがあり、2 つの子クラス Address と Department があるとします。これらのフェッチ プロファイルは、Employee クラスで設定できます。

@FetchProfiles({ @FetchProfile(name = "emp_address", fetchOverrides = { @FetchProfile.FetchOverride(entity = Employee.class, association = "addresses", mode = FetchMode.JOIN) }), @FetchProfile(name = "emp_department", fetchOverrides = { @FetchProfile.FetchOverride(entity = Employee.class, association = "departments", mode = FetchMode.JOIN) })}) public class Employee {

@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Set addresses;

@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Set departments; }

従業員レコードを取得するときに、fetchprofile を有効にすることができます。フェッチ プロファイルが有効になっている場合、結合を行っているため、子オブジェクトは熱心にフェッチされます。

session.enableFetchProfile("emp_address");
session.enableFetchProfile("emp_department");
Criteria criteria = session.createCriteria(Employee.class); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
List employees = criteria.list();
于 2013-06-09T07:23:09.173 に答える