【发布时间】: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 为整个方法打开一个会话?
【问题讨论】: