当前位置: 首页 > 知识库问答 >
问题:

Hibernate中非事务性类/方法中的惰性加载

左翰海
2023-03-14

我在spring-hibernate应用程序中工作。流程和往常一样:controller-->service-->DAO

我用@transactional注释了服务层类,从而将该类中的每个方法都标记为事务性的。在服务类中,我调用DAO以获取某个域对象,然后将其转换为DTO/VO对象,该对象将传递给Controller。为了将域对象转换为DTO,我编写了另一个自定义静态类(只有静态方法的类),如ObjectMapper,它将进行此转换。

现在,域对象有一些子对象(一对多),它被懒洋洋地加载。因此,当我在ObjectMapper中访问子getter方法时,会发出一个额外的数据库调用,该调用运行良好。我不明白的是,由于ObjectMapper不是Transaction,所以在进行数据库调用以从数据库中获取子对象时,我希望抛出一些异常,比如Session is closed。我在DAO中使用Session FactoryGetCurrentSession

谁能给我解释一下这种行为吗?

共有1个答案

鲜于谦
2023-03-14

我认为您可以从事务性服务方法调用ObjectMapper(您应该),或者如果不调用ObjectMapper,则可能启用了“hibernate.enable_lazy_load_no_trans”,以保持hibernate会话打开

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

  • 我在想最近遇到的一个案子。假设我们有一个服务方法,如下所示: 添加用户的工作仅是因为存在。整个方法属于另一个服务,外观如下: 我不确定我是否正确理解为什么添加一个用户是有效的。根据Hibernate文档,只有当实体处于托管状态并且更新发生在单个事务中时,才会发生自动更新。如果我的推理是正确的,就会发生以下步骤: 当请求到来并命中控制器时,实体管理器(Hibernate会话)被附加到当前线程。(?)

  • 问题内容: 好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类: 在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”: 因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。 但是,我在这里提出我的问题: 1-当我请

  • 我正在查看一些现有的代码,并想知道在下面的场景中使用Spring的@Transactional注释会发生什么?考虑以下示例: 下面的updateDataBaseItem()方法是常见的,可以从其他非事务性方法和上面的方法调用:

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

  • 问题内容: 我使用Hibernate 5.2.5(如果重要的话,也可以使用kotlin和spring 4.3.5),并且我希望延迟加载类的某些字段。但是问题是所有字段都立即加载,我没有任何特殊的Hibernate设置,也没有使用Hibernate.initialize()。 这就是我的查询方式 TaskRepoImpl: TaskService: 并输出: 请告知我的代码出了什么问题以及如何使Hi