1

我正在使用 Spring 1.2.9 和 Hibernate 3.3.1。我遇到了一个奇怪的交易问题。我春天的交易设置是这样的

<property name="writeInfo*">PROPAGATION_REQUIRED,readOnly</property>
<property name="getFacilities*">PROPAGATION_REQUIRED,readOnly</property>

writeInfo 方法更像是一个服务层,它可以使用其他 DAO 来查询对象、遍历它们、调用其他非数据辅助方法(但可以传递数据对象)。getFacilities 是一种 DAO 方法,可以由任何需要访问数据库对象的方法调用。

我的代码流程是,使用一堆对象 ID 调用 writeInfo,必须将其数据导出到文本文件。writeInfo 方法通过将这些对象传递给 getFacilities DAO 方法来查询这些对象(将 DAO 代理注入到包含 writeInfo 方法的代理中)。一旦 getFacilities 返回对象集合,writeInfo 方法就会调用同一类中的其他辅助方法,这些辅助方法遍历这些对象及其子对象并写入字符串缓冲区。

问题是,当我在 spring-hibernate 事务管理器上调试事务语句时,我看到正在为 writeInfo 方法创建一个事务,并且再次为 getFacilities 方法创建了一个新事务,即使从 writeInfo 中调用了 getFacilities 方法方法。更大的问题是,当对象从 getFacilities 方法返回并从 writeInfo 传递给其他辅助方法时,对子对象(主对象中的集合)的任何访问都会由于会话关闭而导致 LazyIntialization 异常。

writeInfo 方法启动的事务不应该一直可用到方法结束吗?为什么 getFacilities 方法在返回对象时创建新事务并在事务后关闭会话?这是这个特定版本的 Spring 中的错误还是我做错了什么。

任何帮助是极大的赞赏。

4

0 回答 0