情况如下
@Entity
public class Table_A implements Serializable {
//TABLE_A FIELDS
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TABLE_BID")
public Table_B getTable_B() {
return table_B;
}
}
因此Table_A和Table_B之间存在多对一的关系 我的问题是当我做一个
Long tableB_ID = table_A.getTable_B().getTable_BID();
在JPA / Hibernate实现中,fetch获取TABLE_B的实例并从中获取相应的ID
或
从映射的列中获取ID?
先谢谢你的答案。
答案 0 :(得分:1)
参考this answer:前者。
Hibernate需要检查引用的Table_B
实例是否仍然存在,因此必须在调用getTable_BID()
之前加载实例。
编辑:实际上,更有趣的问题是this one。它说Hibernate选择的内容取决于访问类型 - 属性访问(这就是你所拥有的)不会初始化代理;字段访问(将@ManyToOne
/您的@Id
放在字段上)初始化代理并从数据库加载实体。
答案 1 :(得分:1)
当您为关系指定Lazy fetch时,它表示当您在此时调用方法getTable_B()时访问该对象时,持久性提供程序在数据库中生成一个select并填充该对象。它的行为是持久性提供程序的支持,在Hibernate的情况下,它使用代理对象,因此当您访问相关对象的字段时进行获取,因此getTable_B()。getTable_BID()。如果您只想访问TABLE_BID,可以进行JPQL查询,或者在表A中映射此字段,所以
@Column(name="TABLE_BID")
public Long getTable_BID() {
return table_BID;
}
答案 2 :(得分:1)
AFAIR,它取决于访问类型,它本身取决于您对实体进行注释的方式。如果您注释了getter,那么您正在使用属性访问类型,并且获取ID将不会从数据库加载TableB状态。如果您注释了字段,那么您正在使用字段访问类型,并且获取ID将加载TableB状态。
这当然是依赖于实现的。但您可以通过打开SQL登录,执行代码以及查看是否生成加载TableB状态的查询来轻松检查它。