gpt4 book ai didi

java - 使用 Spring 在 Hibernate 中处理 session

转载 作者:行者123 更新时间:2023-11-29 08:19:35 25 4
gpt4 key购买 nike

我不是 hibernate 的初学者,但我是在 Spring 中使用 Hibernate 的初学者。我读了《Spring in Action》这本书。所以我写了一个小应用程序来理解书中的例子。这是我的应用程序的摘录。如果你愿意,我可以给你更多。

@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public void runQuery()
{
final BuildingDAO buildingDAO = ( BuildingDAO ) applContext.getBean( "buildingDAO" );
final Building building = buildingDAO.getBuildingById( "HQ" );
logger.debug( "Loaded building: " + building.getId() );
logger.debug( "Loaded building: " + building.getName() );
}

对象加载没有任何问题。主键的日志也没有问题。但是string属性的log导致了LazyInitializationException。我明白为什么会这样。 Hibernate 返回了一个具有代理属性的代理。当我想访问延迟加载的属性时,Hibernate 尝试加载该值但 session 已关闭。延迟加载是 Hibernate 的一个很棒的特性,我不想错过它。

Spring 为我管理 session 处理。 Spring 在 Hibernate 模板的加载方法中打开一个 Hibernate session ,并在该方法完成后关闭该 session 。

但是现在我想建议Spring在整个方法(runQuery())中打开session,如上所示。我想显示对象的一些属性。我提到我可以使用 Spring 的交易管理器来做到这一点。所以我使用了Spring的Transactional-Annotation。但它不起作用。也许我使用事务管理器的假设是错误的。

有没有人建议 Spring 为整个方法打开一个 session ?

最佳答案

您确定 Propagation.SUPPORTS 是您真正需要的吗?这不会强制执行事务的存在,它只是在存在时使用它。系统的某些其他部分需要启动并提交事务。如果不存在,则 session 可能无法维持到您的日志语句为止,从而导致延迟加载错误。

尝试使用其他一些隔离级别(例如 REQUIRED,或者更好,不要全部指定,并依赖默认值),看看是否能解决您的问题。

关于java - 使用 Spring 在 Hibernate 中处理 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1259157/

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