spring mvc hibernate正确的事务管理方式

时间:2012-07-04 17:18:54

标签: java hibernate spring-mvc

也许标题有点误导,但我想请你提一些建议。

现在假设我已经使用hibernate和事务配置了我的spring mvc应用程序。部分配置如下所示:

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="oracle.jdbc.OracleDriver"/>
    <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
    <property name="user" value="xxx"/>
    <property name="password" value="xxx"/>
    <property name="maxPoolSize" value="10"/>
    <property name="maxStatements" value="0"/>
    <property name="minPoolSize" value="5"/>
</bean>
<!-- Session Factory Declaration -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
    <property name="packagesToScan" value="com.execon.models"/>
</bean>

<!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager"/>

<!-- Transaction Manager is defined -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

基本上我现在需要做的只是@Autowired我的sessinFactory to class将管理数据库访问权限吗?

一个简单的示例,虽然它位于@Controller,但我会将其移至@Service

@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;

@RequestMapping(value = "/")
public String getMainPage( Model model )
{
    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    Query query = session.createQuery( "from Period" );
    List<Period> list = query.list();
    System.out.println( list );
    session.getTransaction().commit();
    return "MainPage";
}

正如您所看到的,我只是想尝试将映射类的std控制台列表。它工作得很好,但我需要一个建议如何在更大的项目中管理它。我应该有一些获得会话和开始交易的util类吗?或者我应该使用一些模板来管理这个?我只是想写这个:

    Session session = sessionFactory.getCurrentSession();
    session.beginTransaction();
    //
    //...
    //
    session.getTransaction().commit();

在我需要连接到DB的每个地方。也许我错过了什么,或者完全错了?任何帮助将不胜感激

1 个答案:

答案 0 :(得分:3)

您缺少的是春季交易注释。

@RequestMapping(value = "/")
@Transactional
public String getMainPage( Model model )
{
    Session session = SessionFactoryUtils.openSession(sessionFactory);
    Query query = session.createQuery( "from Period" );
    List<Period> list = query.list();
    System.out.println( list );
    return "MainPage";
}

显然,正如你指出的那样,正常的做法就是将db内容分开。

在您的上下文文件中,您需要:

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

请注意,在此特定示例中,您需要将其放在XXX-servlet.xml上下文文件中,因为这是配置控制器的事情。

spring和hibernate的一般想法是使用spring进行事务和连接管理。使用SessionFactoryUtil registrators将hibernate Session作为绑定到当前线程的事务资源。