什么时候检索Hibernate代理的id初始化代理?

时间:2010-02-09 23:20:50

标签: java hibernate lazy-loading

在Hibernate中,当您通过加载检索实体时,如果您访问该Entity的id访问者,则它不会初始化代理:

Property myProp = (Property) session.load(Property.class, myId);
myProp.getId(); // Doesn't load the proxy
myProp.getDescription();  // Loads the proxy from the database hit

但是,我不清楚加载关联代理的规则是什么。我的印象是,当您通过HQL查询或条件检索实体时,适用相同的规则。

我的代码中的每个Property都有一个CompanyCompany被声明为:

@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "company_id", nullable=false)
private Company company;

但是,在我的代码中,我在迭代Properties时正在获得N + 1选择,因为在我调用Company时正在加载Company.getId()

CompanyProperty对象中,id字段是使用@Id进行长注释的。

为了防止加载Company实体,我是否还缺少其他一些考虑因素?

1 个答案:

答案 0 :(得分:10)

由于您必须使用属性访问而不是字段访问权限,它无法正常工作。

而不是

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="COMPANY_ID", nullable=false)
private Company company;

使用

@ManyToOne(fetch=FetchType.LAZY, optional=false)
@JoinColumn(name="COMPANY_ID", nullable=false)
public Company getCompany() {
    return this.company;
}

注意您不能同时使用属性访问和字段访问。所以你应该选择一种方法

的问候,