当前位置: 首页 > 面试题库 >

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

卢德惠
2023-03-14
问题内容

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

  @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,如何知道该属性的值?


问题答案:

您打电话的时候

person.getType().getDescription()

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

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

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

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



 类似资料:
  • 这组订单应该是惰性加载的,但我得到以下异常:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是org.hibernate.lazyInitializationException:未能懒洋洋地初始化Role:...,没有会话或会话被关闭 根本原因:org.hibernate.lazyInitializationExcept

  • 我试着调整我的应用程序,所以我把关系变成懒惰的,只取我需要的东西 我的多对一关系有一个问题,当我再次加载实体时转到lazy时,Hibernate将实体替换为代理,即使我获取了该实体,而该代理在应用程序的视图部分(JSF)中不工作。当多对一处于急切模式时,问题就会消失,但hibernate会为每个多对一执行一个select more(选择更多),即使我不需要它们 1/ 2/ JPQL查询: =>两次

  • 在标记为重复之前,请考虑我已经翻阅了许多相关的堆栈溢出帖子,以及网站和文章。我还没有找到解决办法。 这个问题是Selenium Webdriver找不到XPATH的后续问题,尽管字符串看起来完全相同。通过更新代码以更优雅的方式工作,我确定问题实际上不是来自xpath方法: 这适用于前5ish元素。但是之后它会超时,通过获取img_div的内部html并打印它,我发现对于超时的元素,不是我想要的图像

  • 问题内容: hibernate中的property标签的lazy属性允许按照以下链接延迟加载属性:http : //docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping- declaration -属性 lazy(可选-默认为false):指定在首次访问实例变量时应延迟获取此属性。它需要构建时字节码检测

  • 我们目前有几个@OneToOne关系,由于已知的惰性加载的限制,它们总是会急切地从反方向获取。 为了启用逆关系的延迟加载,我正在尝试启用构建时字节码检测。 到目前为止我所做的... 这些关系现在不再急切地加载...但是它们也不会延迟加载,它们只是静默地返回null。 我尝试从实体中删除接口和字段,因为我不确定是否需要这样做,在此之后,我在启动时不再获得消息,并且默认情况下返回到急切加载。 我是不是

  • 我谷歌了很多,这是真的奇怪的Spring Boot(最新版本)可能没有懒惰加载是不工作的。以下是我的代码片段: 我的资源: 我的服务: 编辑2: 对于规范构建,我有: