1

我正在使用带有 Spring 3.0.5 的 Hibernate 3.6。

我有一个用户对象的以下映射

<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" />
    ...

用户与组织具有多对一的关系。通常,我希望急切加载该关系,因此映射坚持默认设置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

可以使用 fetchProfiles 以编程方式设置 FetchType

例如:考虑有一个 Employee 类,它有两个子类 Address 和 Department Fetch 配置文件,这些可以在 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 回答