一尘不染

一对一hibernate:getId()无需获取整个对象

hibernate

我想获取一对一关系的ID,而不加载整个对象。我以为可以使用如下所示的延迟加载来做到这一点:

class Foo { 
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    private Bar bar; 
}


Foo f = session.get(Foo.class, fooId);  // Hibernate fetches Foo

f.getBar();  // Hibernate fetches full Bar object

f.getBar().getId();  // No further fetch, returns id

我希望f.getBar() 触发另一个提取。我希望hibernate给我一个代理对象,该代理对象使我可以调用.getId()而不实际获取Bar对象。

我究竟做错了什么?


阅读 230

收藏
2020-06-20

共1个答案

一尘不染

使用 财产访问策略

代替

@OneToOne(fetch=FetchType.LAZY, optional=false)
private Bar bar;

采用

private Bar bar;

@OneToOne(fetch=FetchType.LAZY, optional=false)
public Bar getBar() {
    return this.bar;
}

现在工作正常!

如果调用 不是标识符getter方法的 任何方法 则会初始化代理。但是它仅在使用属性访问策略时有效。记在心上。

请参阅:Hibernate
5.2用户指南

2020-06-20