gpt4 book ai didi

java - hibernate/Spring 事务管理问题

转载 作者:行者123 更新时间:2023-11-30 07:31:17 25 4
gpt4 key购买 nike

我正面临 Spring 事务管理的问题。我正在使用 hibernate 作为 ORM 框架。下面是我的事务管理的spring。

  <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>

我基本上遵循提到的 genericDao 方法 here所以我的 DaoObject 用于获取域对象,服务类有 DAO 对象来操纵它们。

我面临的问题:我正在查询一个大型数据集并将结果加载到服务类中的列表中。我已将服务类标记为@transactional(readonly ="true")。

为了处理一些需求,我已经将 boxed primitive 的所有 getter 更改为

  @Column(name = "students")
public Long getStudents() {
if(students== null){
return 0l;
}
return this.students;
}

每当我通过命名查询加载所有数据集时。随后会触发多个更新查询以更新数据集。我对此进行了调试,并了解到这是由于 transaction.commit 而发生的。因为 hibernate 将我的实体视为脏的。

有什么办法可以避免这种情况。我知道 Flushmode.never 可能有帮助,但在我的应用程序中,seesion 对象没有暴露,所以我无权访问它。是否有任何其他方式或一些映射更改可以帮助我?

最佳答案

除了 Xavi López 的回答之外,另一种选择是将 Hibernate 处理的持久属性与符合您要求的 transient 属性分开。例如如下:

@Column(name = "students")
public Long getStudentsInternal() {
return students;
}

@Transient
public Long getStudents() {
if (students == null) {
return 0l;
}
return students;
}

您还可以通过将注释移动到字段来配置 Hibernate 使用字段而不是属性,它也会解决您的问题(请注意,注释的放置应该与实体的所有字段一致,或者您可以使用 @Access 配置排除项):

@Column(name = "students")
private Long students;

public Long getStudents() {
if (students == null) {
return 0l;
}
return students;
}

关于java - hibernate/Spring 事务管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7404075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com