Hibernate jpa-为什么惰性引用id的getter执行数据库语句

Hibernate jpa-为什么惰性引用id的getter执行数据库语句,hibernate,jpa,lazy-loading,getter,Hibernate,Jpa,Lazy Loading,Getter,乘积和参数之间只有一个uni关系。(JavaAssistant用于实现惰性引用。代码在Spring容器中执行) 现在我想: 1. Product p = em.find(Product.class, 1L); 2. System.out.println(p.getParameter().getId()) 在日志中我可以看到: select ... **product1_.parameterID** as paramet11_38_ ... from Product product1_ w

乘积和参数之间只有一个uni关系。(JavaAssistant用于实现惰性引用。代码在Spring容器中执行)

现在我想:

 1. Product p = em.find(Product.class, 1L);
 2. System.out.println(p.getParameter().getId())
在日志中我可以看到:

select ... **product1_.parameterID** as paramet11_38_ ... from Product product1_  where product1_.id=?
select parameter0_.id as id49_0_ ... from Parameter parameter0_ where parameter0_.id=?
当Jpa知道参数的id(因为它在第一行读取)时,为什么要执行第二行的查询? 当它被要求提供id以外的其他属性时,它应该执行查询。你们不这么认为吗? 为什么会这样?我们可以强制休眠到不同的行为吗

环境:

  • Hibernate 3.6.10作为JPA提供者
  • Spring 3.1.0
  • JavaAssistant用于实现惰性引用

此问题注册为bug()。
将来可能会被更正。

当您只需调用
System.out.println(p.getParameter())
时,您认为会发生什么?应该打印什么?空
参数
对象(因为它尚未加载)?Hibernate在这里有点急切,我希望在这里显示Id而不执行DB语句。在“解析”任何其他属性之前,代理应该知道自己的Id和唯一的Id。为True,但不应该
toString()
(调用
println()
)至少尝试访问所有属性(而不仅仅是
Id
),从而触发数据库加载?我的观点是,一旦调用
getParameter()
,Hibernate就会认为您需要整个对象。显然它不够聪明。对不起,我认为它是这样写的:
System.out.println(p.getParameter())
。hibernate可以通过调用
System.out.println(p.getParameter())
执行语句。它应该在
toString()
期间访问所有属性。我希望Hibernate在我询问Id以外的任何其他属性之前不会执行任何DB查询。您知道其他jpa提供者的行为吗?
select ... **product1_.parameterID** as paramet11_38_ ... from Product product1_  where product1_.id=?
select parameter0_.id as id49_0_ ... from Parameter parameter0_ where parameter0_.id=?