在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
都有一个Company
。 Company
被声明为:
@ManyToOne(fetch = FetchType.LAZY, optional=false)
@JoinColumn(name = "company_id", nullable=false)
private Company company;
但是,在我的代码中,我在迭代Properties
时正在获得N + 1选择,因为在我调用Company
时正在加载Company.getId()
。
在Company
和Property
对象中,id字段是使用@Id
进行长注释的。
为了防止加载Company
实体,我是否还缺少其他一些考虑因素?
答案 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;
}
注意您不能同时使用属性访问和字段访问。所以你应该选择一种方法。
的问候,