2

也许标题有点误导,但我想向您请教一条建议。

现在假设我已经为我的 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 到将管理数据库访问权限的类?

一个简单的示例,虽然它带有@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";
}

如您所见,我只是想将映射类的标准控制台列表放入。它工作得很好,但我需要一条建议如何在更大的项目中进行管理。我应该有一些 util 类来获取会话并开始事务吗?或者我应该使用一些模板来管理它?只是我不想写这个:

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

在我需要连接到数据库的每个地方。也许我错过了一些东西,或者完全错了?任何帮助,将不胜感激

4

1 回答 1

3

您缺少的是 spring 事务注释。

@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";
}

显然,正如您所指出的,正常的事情是分离出数据库的东西。

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

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

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

spring 和 hibernate 的总体思路是使用 spring 进行事务和连接管理。注册器使用SessionFactoryUtilhibernate Session 作为事务资源绑定到当前线程。

于 2012-07-04T17:26:56.267 回答