我有一箇舊項目,我試圖升級到春季4 /休眠4.在hibernate 4/spring 4中使用TransactionProxyFactoryBean?
我們使用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 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()',它實際上做anoymous內部類?
如何在不使用HibernateDaoSupport和HibernateTemplate類的情況下像以前一樣使項目的事務工作?
我試圖用我的標籤「的CustomerService」(即所謂的「PersonDao的」業務邏輯對象)@Transactional但(A)我看到不管了同樣的錯誤和(B)我真的很喜歡能夠以編程方式執行此操作,以減少代碼現在工作方式的變化規模。我也嘗試將交易放在DAO層面,並且遇到了同樣的問題。
道歉,如果這是太多的細節堆棧溢出格式。