java - 使用 Spring 在 Hibernate 中处理 session

标签 java hibernate spring

我不是 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/

相关文章:

java - 如何在客户端/服务器 Java 应用程序中传输文件

java - Spring Security 4 JTwig 将 CSRF token 放入表单中

java - 延迟加载不起作用 - 我只需要父对象,而不是所有关联

java - 如何在 Spring JDBC 中创建对象之间的关系?

java - 我可以将注释注入(inject)到 pojo 中吗

java - 如何覆盖 Android debug、release、main 中的变量?

java.sql.SQLException : Field 'name' doesn't have a default value

java - Hibernate Criteria API - 使用一个数据库查询更新多行

java - tomcat不支持major.minor版本52.0

java - Spring数据存储库: "Containing" for Collections