这是将 Hibernate 集成到 Spring 中的众多方法之一......
您的服务(或 DAO)类应该看起来像这样简单:-
// annotate this class so that Spring is aware of it
@Service
public class EmployeeServiceImpl implements EmployeeService {
@Autowired
private SessionFactory sessionFactory;
// this is straight-up HQL... really, no magic here
@Override
@SuppressWarnings("unchecked")
public Collection<Employee> getAllEmployees() {
return sessionFactory.getCurrentSession()
.createQuery("from Employee e order by e.lastName, e.firstName")
.list();
}
}
现在,您需要配置sessionFactory
,否则自动装配将失败。所以,这就是你配置它的方式: -
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
<!--
When creating the session factory, point it to your existing hibernate.cfg.xml.
You can also port your entire Hibernate configuration and HBM mappings here, but
for simplicity sake, I'll reference the existing hibernate.cfg.xml here so that we
are not cluttering Spring configuration file with Hibernate-specific configuration.
-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<!-- If you are running in production, you will want to use JNDI connection -->
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myapp"/>
<!-- If you are running testcases, you might want to use JDBC instead -->
<!--
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/>
<property name="url" value="jdbc:jtds:sqlserver://machine/myapp"/>
<property name="username" value="myapp"/>
<property name="password" value="myapp"/>
</bean>
-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config proxy-target-class="true">
<aop:advisor pointcut="execution(* com.myapp..*.*(..))" advice-ref="txAdvice"/>
</aop:config>
</beans>
有两种配置事务的方法:1)使用@Transactional
并且您可以注释哪些类(或特定方法)需要正确的事务处理,以及 2)使用 AOP 并用事务包装所有代码。
在上面的示例中,我将所有代码与com.myapp
带有事务的基本包一起包装。您可以更改(或添加)切入点以减少事务包装器。