Lazy Fetch JPA获取JoinCoulmn MappedBy ID

时间:2013-12-16 18:24:41

标签: java sql hibernate java-ee jpa

情况如下

      @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?

先谢谢你的答案。

3 个答案:

答案 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状态的查询来轻松检查它。