【问题标题】:Session handling in Hibernate with Spring使用 Spring 在 Hibernate 中进行会话处理
【发布时间】:2009-08-11 08:55:45
【问题描述】:

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

@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() );
}

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

Spring 为我管理会话处理。 Spring 在 Hibernate-template 的 load-method 中打开一个 Hibernate 会话,并在该方法完成后关闭该会话。

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

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

【问题讨论】:

    标签: java hibernate spring


    【解决方案1】:

    您确定Propagation.SUPPORTS 是您真正需要的吗?这不会强制执行交易的存在,它只是在它存在时使用它。系统的其他部分需要启动并提交事务。如果不存在,则会话可能不会像您的日志语句那样被维护,从而导致延迟加载错误。

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

    【讨论】:

      【解决方案2】:

      更改为 REQUIRED 或将其留空,将解决您的问题。 Propagation.SUPPORTS 实际上并没有启动事务...... 见http://www.ibm.com/developerworks/java/library/j-ts2.html

      您可能没有禁用非事务性读取(默认启用),因此读取成功,但该读取的事务仅用于读取本身(不适用于对返回对象的后续读取)。

      记录事务活动的类别是 org.springframework.transaction IIRC - 如果您将其设置为 DEBUG,您将看到有关何时启动和提交事务的详细信息。

      【讨论】:

        【解决方案3】:

        如果您希望RunQuery 在 Spring 事务中运行,您必须从容器中获取将其定义为 Spring bean 的类的对象。这样,Spring 可以将事务逻辑包装在 bean 周围(以及它定义的任何方法)。
        将该类定义为 spring bean 还可以避免调用 (BuildingDAO)applContext.getBean("buildingDAO"),因为 spring 会将 dao 连接到您的类中(如果您在上下文 xml 或属性中正确定义它)。

        【讨论】:

          猜你喜欢
          • 2019-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          • 2016-04-26
          • 2017-01-23
          相关资源
          最近更新 更多