检索休眠代理的 ID 何时初始化代理?

2022-09-04 03:48:01

在休眠中,当您通过加载检索实体时,如果您访问该实体的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查询或条件检索实体时,相同的规则适用。

我的代码中的每一个都有一个.声明如下:PropertyCompanyCompany

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

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

在 和 对象中,id 字段都是一个用 .CompanyProperty@Id

为了防止实体的加载,我是否遗漏了其他一些注意事项?Company


答案 1

它不能按预期工作,仅仅是因为您必须使用属性访问而不是字段访问。

而不是

@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;
}

请注意,您不能同时使用属性访问和字段访问。因此,您应该选择一种方法

问候


答案 2

推荐