gpt4 book ai didi

java - proxy如何加载Hibernate/JPA中的lazy属性

转载 作者:行者123 更新时间:2023-11-30 07:12:54 24 4
gpt4 key购买 nike

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

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

在我的主类中,我使用未初始化的“type”属性调用 Person,如下所示:

 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 对象,并在控制台上打印了人员的类型。在这一刻,代理 CGLIB 工作并发挥你的魔力,一切正常。

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

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

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

如果答案是否定的:如果属性不是从数据库加载的,Proxy 如何知道属性的值?

最佳答案

当你打电话时

person.getType().getDescription()

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

This method to get value of a property can be very painful, because i think Hibernate goes everytime in database to get this information behind the scenes.

每个代理只会执行一次。当它第一次运行时,它会在代理上设置一个标志,指示它已初始化,因此底层目标实体具有正确的值。如果已加载所有值,则无需返回数据库。

这并不是 Hibernate 创建其代理的确切方式,但值得一读:Proxy Pattern .

关于java - proxy如何加载Hibernate/JPA中的lazy属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com