- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个旧项目,我正在尝试升级到 spring 4/hibernate 4。
我们使用 this配置我们的交易的方法。
也就是说,在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>
和
<bean id="MySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="configLocation" value="WEB-INF/hibernate.cfg.xml" />
</bean>
然后我们的每个服务 bean 都被定义为:
<bean id="customerService" parent="abstractTransactionProxy">
<property name="target" ref="customerTarget"/>
<property name="personDAO" ref="personDAO" />
</bean>
DAO 的定义如下:
<alias name="personDaoImpl" alias="personDAO"/>
<bean id="personDaoImpl"
class="com.foo.bar.hibernate.PersonDaoImpl">
<property name="sessionFactory" ref="MySessionFactory" />
</bean>
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;
}
现在,我现在面临的问题是摆脱我们对从 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;
}
当然,这会给我带来编译时错误,因为“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() {
}
}
现在我可以构建、部署和运行了,但我遇到了这个错误消息:
No session available in this thread
我怎样才能做到这一点?
简单来说,'hibernateCallback()' 是什么,它实际上是匿名内部类在做什么?
如何在不使用 HibernateDaoSupport 和 HibernateTemplate 类的情况下让我的项目事务像以前一样工作?
我尝试使用@transactional 标记我的“CustomerService”(调用“PersonDao”的业务逻辑对象),但是(A)无论如何我都会看到相同的错误,并且(B)我真的希望能够这样做以编程方式,以减少对代码现在工作方式的更改规模。我也尝试将事务放在 DAO 级别,并遇到了同样的问题。
抱歉,对于堆栈溢出格式而言,这太详细了。
最佳答案
您需要将 SessionFactory 注入(inject)到您的 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;
}
}
将 @Transactional
添加到您的服务方法中
指示 Spring 使用声明式事务:
<tx:annotation-driven transaction-manager="transactionManager"/>
确保使用 LocalSessionFactoryBean
来创建 SessionFactory
关于java - 将 TransactionProxyFactoryBean 与 Spring 和 Hibernate 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29923127/
这是我正在使用的示例配置。 当我从外部类调用 doSomething() 方法时,事务性是所需的。 但是,当我从“目标”bean 中调用相同的方法时,事务似乎从未启动,因此在失败时不会发生回滚。 这是
我有一个在 XML 中创建的存储库类,如下所示: PROPAGATION_REQUIRED 然后我有一个使用存储库的类,如下所示: @Autowired Rep
我在 GWT 框架下设置 Spring 和 Hibernate 时遇到问题。我对 GWT 还很陌生。我已经设置了应用程序上下文并加载,没有输出错误,但目前的主要问题是我的服务层实现 (PobaseSe
我读到了有关使用 并用 @Service("myService") 注释我的服务 bean,并且认为很好,我会这样做,因为我已经使用我的 Controller 这样做了。我通
服务层的接口(interface)是: EMS.java: public interface EMS extends UserDetailsService { public void save
我有一个旧项目,我正在尝试升级到 spring 4/hibernate 4。 我们使用 this配置我们的交易的方法。 也就是说,在XML中我们定义了一个事务管理器,像:
我是一名优秀的程序员,十分优秀!