MDP*_*MDP 4 java spring hibernate spring-mvc spring-transactions
我正在尝试使用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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是给我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;
}
Run Code Online (Sandbox Code Playgroud)
现在我试图以声明的方式使用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>
Run Code Online (Sandbox Code Playgroud)
现在,我应该在方法salvaUtente()中写什么来执行许多插入,例如像这样
session.saveOrUpdate(User);
session.saveOrUpdate(UserCredentials);
session.saveOrUpdate(UserOtherDetails);
Run Code Online (Sandbox Code Playgroud)
并使Spring处理commint和rollback?
首先,您使用的是错误的事务管理器.该DataSourceTransactionManager不是休眠,但对于普通的JDBC.如果你使用普通的Hibernate使用HibernateTransactionManager.(假设你在这里使用Hibernate 4!).
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)
现在我还建议使用@Transactional而不是<tx:advice />和<aop:config />块.使您的配置更容易.只需删除2个提到的块并替换为<tx:annotation-driven />.
<tx:annotation-driven />
Run Code Online (Sandbox Code Playgroud)
现在你的代码错了,因为你自己开始交易.使用@Transactional(在添加上述内容之后)注释您的方法并删除您的事务处理代码.
@Transactional
public void salvaUtente(Utente utenteIn) throws DAOException{
Session session = getHibernateSession(); //from this method I get Hibernate SessionFactory
session.saveOrUpdate(Object);
}
Run Code Online (Sandbox Code Playgroud)
现在我不知道你的getHibenateSession方法做了什么,但确保你没有使用openSession它SessionFactory来获得一个会话.请getCurrentSession改用.
protected Session getHibernateSession() {
return sessionFactory.getCurrentSession();
}
Run Code Online (Sandbox Code Playgroud)
你目前的BaseDAO班级有缺陷.删除buildSessionFactory并删除static final.让Spring配置并注入SessionFactory.
public abstract class BaseDAO {
@Autowired
private SessionFactory sessionFactory;
protected Session getHibernateSession() {
return sessionFactory.getCurrentSession();
}
}
Run Code Online (Sandbox Code Playgroud)
在您的配置中添加配置LocalSessionFactoryBean.
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
... Other Hibernate Properties
</bean>
Run Code Online (Sandbox Code Playgroud)
这基本上就是所需要的.这也在Spring Reference指南中详细解释.我强烈建议阅读.
| 归档时间: |
|
| 查看次数: |
3123 次 |
| 最近记录: |