一尘不染

代理如何在Hibernate / JPA中加载惰性属性

hibernate

好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类:

  @Entity
  public class Person{
    @Column
    private String name;
    @ManyToOne(fetch = FetchType.Lazy)
    @JoinColumn(name = "id_type")
    private TypePerson type;
 }

在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”:

 public void init(){
    //in this point "type" attribute is not initialized
    Person person = dao.find("Select * from Person where id = 12");

    //proxys work here to get description of "type" attribute
    System.out.println(person.getType().getDescription());
  }

因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。

但是,我在这里提出我的问题:

1-当我请求“ getType()”时,Hibernate(或其他机制)在后台进行SQL查询吗?如:“ SELECT * FROM
TypePerson,其中id = 3”。

如果答案是肯定的: 这种获取属性值的方法可能会非常痛苦,因为我认为Hibernate每次都会在数据库中进行操作以获取这些信息。

如果答案是否定的: 如果未从dataBase加载Proxy,如何知道该属性的值?


阅读 255

收藏
2020-06-20

共1个答案

一尘不染

您打电话的时候

person.getType().getDescription()

如果person引用的是尚未初始化的Hibernate代理,则可以,它将发出SQL查询以检索目标实体的字段值。

这种获取属性值的方法可能会非常痛苦,因为我认为Hibernate每次都会在数据库中进行操作以获取这些信息。

每个代理服务器只会发送一次。第一次使用时,它将在代理上设置一个标志,指示其已初始化,因此基础目标实体具有正确的值。如果已加载所有值,则无需返回数据库。

这不是Hibernate创建代理的确切方式,但是很好阅读:Proxy
Pattern

2020-06-20