gpt4 book ai didi

java - spring mvc hibernate 事务管理的正确方法

转载 作者:行者123 更新时间:2023-12-04 05:40:22 25 4
gpt4 key购买 nike

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

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

    <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 session = sessionFactory.getCurrentSession();
session.beginTransaction();
//
//...
//
session.getTransaction().commit();

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

最佳答案

您缺少的是 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上下文文件,因为那是配置 Controller 的东西。

spring 和 hibernate 的总体思路是使用 spring 进行事务和连接管理。使用 SessionFactoryUtil注册者将 hibernate session 作为绑定(bind)到当前线程的事务资源。

关于java - spring mvc hibernate 事务管理的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11333236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com