也许标题有点误导,但我想请你提一些建议。
现在假设我已经使用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的每个地方。也许我错过了什么,或者完全错了?任何帮助将不胜感激
答案 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作为绑定到当前线程的事务资源。