Pau*_*aul 13 java orm configuration spring hibernate
我有一个旧项目,我正在尝试升级到spring 4/hibernate 4.
我们使用这种方法来配置我们的交易.
也就是说,在XML中我们定义了一个事务管理器,如:
<bean id="abstractTransactionProxy"
abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="hibernateTransactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_SUPPORTS,readOnly</prop>
</props>
</property>
Run Code Online (Sandbox Code Playgroud)
和
<bean id="MySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="configLocation" value="WEB-INF/hibernate.cfg.xml" />
</bean>
Run Code Online (Sandbox Code Playgroud)
然后我们的每个服务bean定义如下:
<bean id="customerService" parent="abstractTransactionProxy">
<property name="target" ref="customerTarget"/>
<property name="personDAO" ref="personDAO" />
</bean>
Run Code Online (Sandbox Code Playgroud)
和DAO定义如下:
<alias name="personDaoImpl" alias="personDAO"/>
<bean id="personDaoImpl"
class="com.foo.bar.hibernate.PersonDaoImpl">
<property name="sessionFactory" ref="MySessionFactory" />
</bean>
Run Code Online (Sandbox Code Playgroud)
PersonDaoImpl(以及所有其他DAO)有许多看起来像这样的方法(所有DAO都扩展了HibernateDaoSupport):
public List<Person> getPersonByCriteria(final String criteria) {
List<Person> results =
(List<Person>) this.getHibernateTemplate().executeFind(new HibernateCallback<List<Person>>(){
public List<Person> doInHibernate(Session session) throws HibernateException, SQLException {
List<Person> results = (List<Person>) session.createQuery(MYSQLHERE).setString("criteria", criteria).list();
return results;
}
});
return results;
}
Run Code Online (Sandbox Code Playgroud)
现在,我面临的问题是摆脱我们对从HibernateDaoSupport扩展我们的DAO的依赖,并且通过扩展,使用它的HibernateTemplate帮助对象.
这是我采取的步骤:
只需从DAO方法中删除它们 - 不要扩展HibernateDaoSupport,删除HibernateTemplate回调.这看起来像:
public List<Person> getPersonByCriteria(final String criteria) {
List<Person> results = (List<Person>) getSessionFactory().getCurrentSession().createQuery(MYSQLHERE).setString("criteria", criteria).list();
return results;
}
Run Code Online (Sandbox Code Playgroud)当然这给了我编译时错误,因为'getSessionFactory'是我刚删除的基类'HibernateDaoSupport'的一部分.
所以我实现了一个'MyHibernateDaoSupport'类,并让我的DAO扩展了它.看起来像:
public class MyHibernateDaoSupport {
private SessionFactory sessionFactory;
protected Session session;
protected static Logger logger = Logger.getLogger(MyHibernateDaoSupport.class);
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
session = this.sessionFactory.getCurrentSession();
}
public SessionFactory getSessionFactory() {
return this.sessionFactory;
}
public Session getHibernateTemplate() {
session = this.sessionFactory.getCurrentSession();
return session;
}
public MyHibernateDaoSupport() {
}
Run Code Online (Sandbox Code Playgroud)
}
现在我可以构建,部署和运行,并点击此错误消息:
No session available in this thread
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
简单来说,'hibernateCallback()'是什么,它的内部类实际上是在做什么?
如何在不使用HibernateDaoSupport和HibernateTemplate类的情况下使项目的事务像以前一样工作?
我尝试用@transactional标记我的'CustomerService'(调用'PersonDao'的业务逻辑对象)但是(A)我看到同样的错误,而且(B)我真的更喜欢能够以编程方式执行此操作,减少代码现在工作方式的变化规模.我也尝试将事务放在DAO级别,并遇到了同样的问题.
如果这对于Stack溢出格式来说太详细了,那就道歉了.
您需要将 SessionFactory 注入到您的 DAO 类中:
@Repository
public class PersonDAOImpl implements PersonDAO {
@Autowired
private SessionFactory sessionFactory;
public List<Person> getPersonByCriteria(final String criteria) {
List<Person> results = (List<Person>) getSessionFactory().getCurrentSession().createQuery(MYSQLHERE).setString("criteria", criteria).list();
return results;
}
}
Run Code Online (Sandbox Code Playgroud)添加@Transactional
到您的服务方法
指示 Spring 使用声明式事务:
<tx:annotation-driven transaction-manager="transactionManager"/>
Run Code Online (Sandbox Code Playgroud)确保您用于LocalSessionFactoryBean
创建 SessionFactory
这是配置 Spring 和 Hibernate 4 的详细分步教程
归档时间: |
|
查看次数: |
2193 次 |
最近记录: |