gpt4 book ai didi

java - Hibernate 和 Spring DataSourceTransactionManager

转载 作者:搜寻专家 更新时间:2023-11-01 02:24:57 24 4
gpt4 key购买 nike

我正在尝试使用 Hibernate 和 Spring DataSourceTransactionManager 来处理提交和回滚功能,但我可能什么也没得到。

在使用 Spring DataSourceTransactionManager 之前,这是我的 DAO 类之一

  package com.springgestioneerrori.DAO;

public class UtenteDAO extends DAOBase{

public void salvaUtente(Utente utenteIn) throws DAOException{

Session session = getHibernateSession(); //from this method I get Hibernate SessionFactory
try{
session.beginTransaction();
session.saveOrUpdate(Object);
session.getTransaction().commit();
}
catch(Exception e){
session.getTransaction().rollback()
}
}
}

这是给我 sessionFactory 的类

 private static final SessionFactory sessionFactory = buildSessionFactory();

private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
return new AnnotationConfiguration().configure().buildSessionFactory();
}
catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
return sessionFactory;
}

public static void shutdown() {
getSessionFactory().close();
}

public Session getHibernateSession (){
Session session = HibernateUtil.getSessionFactory().openSession();
return session;
}

现在我正在尝试以声明方式使用 DataSourceTransactionManager。根据互联网上的一些例子,我写了这个:

 <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />        

<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="salvaUtente"/>
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="userDaoTxPointcut" expression="execution(* com.springgestioneerrori.DAO.UtenteDAO.salvaUtente(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="userDaoTxPointcut" />
</aop:config>

现在,我应该在 salvaUtente() 方法中编写什么来执行许多插入,例如像这样

  session.saveOrUpdate(User); 
session.saveOrUpdate(UserCredentials);
session.saveOrUpdate(UserOtherDetails);

并让 Spring 处理提交和回滚?

最佳答案

首先,您使用了错误的事务管理器。 DataSourceTransactionManager不是用于 Hibernate,而是用于普通 JDBC。如果您使用普通 Hibernate,请使用 HibernateTransactionManager . (假设您在这里使用的是 Hibernate 4!)。

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>

现在我还建议使用 @Transactional而不是 <tx:advice /><aop:config />堵塞。使您的配置更容易。只需删除提到的 2 个 block 并替换为 <tx:annotation-driven /> .

<tx:annotation-driven />

现在您的代码是错误的,因为您自己开始交易。用 @Transactional 注释您的方法(在添加上面的内容之后)并删除您的交易处理代码。

@Transactional
public void salvaUtente(Utente utenteIn) throws DAOException{
Session session = getHibernateSession(); //from this method I get Hibernate SessionFactory
session.saveOrUpdate(Object);
}

现在我不知道你的getHibenateSession方法可以,但请确保您不使用 openSessionSessionFactory 上获得一个 session 。使用 getCurrentSession相反。

protected Session getHibernateSession() {
return sessionFactory.getCurrentSession();
}

您当前的 BaseDAO类是有缺陷的。删除你的 buildSessionFactory并删除 static final .让 Spring 配置并注入(inject) SessionFactory .

public abstract class BaseDAO {

@Autowired
private SessionFactory sessionFactory;

protected Session getHibernateSession() {
return sessionFactory.getCurrentSession();
}
}

在您的配置中添加 LocalSessionFactoryBean 的配置.

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
... Other Hibernate Properties
</bean>

这基本上就是所有需要的。 the Spring Reference guide 中也对此进行了详细说明。 .我强烈建议阅读。

关于java - Hibernate 和 Spring DataSourceTransactionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26889057/

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