我想获取一对一关系的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对象。
我究竟做错了什么?
使用 财产访问策略
代替
@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用户指南