- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 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
方法可以,但请确保您不使用 openSession
在 SessionFactory
上获得一个 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/
我有以下我想模拟的代码。我基本上对模拟 DataSourceTransactionManager 感兴趣。 @Autowired @Qualifier("nesTransactionM
我认为我的事务管理器根本不起作用。在插入数据库时自动增量值增加,但没有添加新数据。我以编程方式定义事务管理器、jdbc 模板和数据源。交易经理: @Bean("txManager") public
org.springframework.jdbc.datasource.DataSourceTransactionManager有什么区别和 org.springframework.batch.sup
我正在尝试使用 Hibernate 和 Spring DataSourceTransactionManager 来处理提交和回滚功能,但我可能什么也没得到。 在使用 Spring DataSource
在我的应用程序中,我使用基于注释的 Spring 配置。 我正在使用 @ComponentScan (而且效果很好)。现在我正在尝试使用 @EnableTransactionManagement 添加
在使用 spring 和 hibernate 构建应用程序时,如果我使用 DataSourceTransactionManager,则出现异常时,它不会回滚。似乎它在不同
我正在将 WebLogic 10.3.3 与 Oracle 11g 一起使用,一旦我从 Spring ResourcelessTransactionManager 切换,就会面临 Spring Bat
下面有什么用: org.springframework.jdbc.core.JdbcTemplate org.springframework.jdbc.datasource.DataSourceTra
简而言之,当我在几分钟没有使用事务后尝试获取连接时,第一个事务设置失败。 当一切正常运行时,我的日志显示简单事务的以下内容: DEBUG: org.springframework.transactio
在 Spring 中连接事务管理器的典型 XML 如下所示: .... properties go here .... 如何使用代码完成同样的事情? @Configurati
我是一名优秀的程序员,十分优秀!