【发布时间】:2011-11-16 06:33:10
【问题描述】:
我遇到了 Spring Transaction 管理的问题。我正在使用休眠作为 ORM 框架。下面是我的事务管理春天。
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="abstractDao"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true" lazy-init="true">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
<property name="postInterceptors">
<list>
<ref bean="finderIntroductionAdvisor"/>
</list>
</property>
</bean>
<bean id="abstractService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true" lazy-init="true">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributeSource">
<ref bean="transactionAttributeSource"/>
</property>
</bean>
我基本上遵循 here 中提到的 genericDao 方法,因此 My DaoObject 用于获取域对象,并且服务类具有 DAO 对象来处理它们。
我面临的问题:我正在查询一个大型数据集并将结果加载到服务类中的列表中。我已将服务类标记为 @transactional(readonly ="true")。
为了处理一些要求,我已将盒装原语的所有吸气剂更改为
@Column(name = "students")
public Long getStudents() {
if(students== null){
return 0l;
}
return this.students;
}
每当我通过命名查询加载所有数据集时。随后会触发多个更新查询以更新数据集。 我对其进行了调试并知道这是由于 transaction.commit 而发生的。因为休眠将我的实体视为肮脏的。
有没有办法避免这种情况。我知道 Flushmode.never 可能会有所帮助,但在我的应用程序中,seesion 对象没有暴露,所以我无权访问它。还有其他方法或一些映射更改可以帮助我吗?
【问题讨论】:
-
当我看到hibernate在仅仅做一个查询之后试图发出更新或删除的唯一情况是映射错误,这使得hibernate认为某些元素被删除或更新了。我只是提到这一点,因为这很有可能是根本问题。
-
我可以建议更改问题的标题吗?由于 SO 被认为是未来的参考,因此问题既可浏览又可搜索非常好。
-
是的,比尔当然可以
标签: java hibernate spring transactions