gpt4 book ai didi

java - Spring HibernateDaoSupport 创建多个 session

转载 作者:行者123 更新时间:2023-11-30 08:14:05 25 4
gpt4 key购买 nike

我的 Web 应用程序使用 Struts2.3 + Spring 3.2.6 + Hibernate 3.X。

我正在使用注释来管理事务。我的 DAO 类如下。

@Transactional(readOnly = true, rollbackFor={Exception.class})
public class CustomerDAOImpl extends HibernateDaoSupport implements CustomerDAO{

//adds the customer
@Transactional(propagation=Propagation.REQUIRED, rollbackFor = {Exception.class})
public void addCustomer(Customer customer){
Session session = getSession();
System.out.println("M1() Hash Code: --->"+session.hashCode()+ " Thread id: "+Thread.currentThread().getId());
//session.save(customer);
}

//return all the customers in list
// @Transactional(propagation=Propagation.REQUIRED, rollbackFor = {Exception.class})
@Transactional(readOnly = true)
public List<Customer> listCustomer(){
Session session = getSession();
System.out.println("M2() Hash Code: --->"+session.hashCode()+ " Thread id: "+Thread.currentThread().getId());
return null; //logic to get the list based on condition

}

这些方法将从服务层调用,如下所示;

customerDAO.addCustomer(customer);
customerDAO.listCustomer();

执行上述代码时,我得到同一线程的不同 session

输出:

M1() Hash Code: --->5026724 Thread id: 21
M2() Hash Code: --->8899550 Thread id: 21

因此,如果 method2() 中出现任何异常,使用 method1() 持久化的数据不会回滚

请让我知道,如何在不失去 Spring 事务管理的情况下获得基于线程的单个 session (如果我使用自己的 HibernateFactory,我会失去 Spring 的事务管理)。

最佳答案

如果您使用 Hibernate,请让您的 DAO 类扩展 HibernateDaoSupport。现在您可以从 getHibernateTemplate() 方法获取 session 。这样你就可以通过 spring-hibernate 管理 session

你可以试试这个 -

appContext.xml

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="submit*" propagation="REQUIRED" read-only="false" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="appControllerTransactionPointCuts"
expression="execution(* com.test.customer.bo.Custom.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="appControllerTransactionPointCuts" />
</aop:config>

删除-

<tx:annotation-driven transaction-manager="transactionManager" />

来自appcontext.xml

现在 AOP 应该管理事务。

交易如何运作 -假设您在多个 DAO 方法中持久化对象,并且希望它们全部发生在一个事务中,那么您必须在调用 DAO 方法的服务层方法上应用事务。例如,在我的例子中,服务层是 com.test.customer.bo.Custom.*

如果您不这样做,那么您的每个 DAO 方法都将在单独的事务中执行,并且如果没有发生异常,将被持久化到数据库。如果DAO层的method2()发生异常,则不会回滚method1(),因为它已经提交了。

关于java - Spring HibernateDaoSupport 创建多个 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29902466/

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