Hibernate和Spring DataSourceTransactionManager

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?

M. *_*num 5

首先,您使用的是错误的事务管理器.该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方法做了什么,但确保你没有使用openSessionSessionFactory来获得一个会话.请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指南中详细解释.我强烈建议阅读.