我以這種方式編碼的自定義通用的DAO:的OpenSessionInViewFilter和定製的春季DAO
public abstract class DAOImpl<T, PK extends Serializable> implements DAO<T, PK> {
private SessionFactory sessionFactory;
protected Logger log = null;
private Class<T> type;
public DAOImpl(Class<T> type) {
this.type = type;
}
public PK insert(T o) {
return (PK) getSession().save(o);
}
....
/**
* {@inheritDoc}
*/
public SessionFactory getSessionFactory() {
return sessionFactory;
}
/**
* {@inheritDoc}
*/
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* {@inheritDoc}
*/
public Session getSession() {
return SessionFactoryUtils.getSession(sessionFactory, Boolean.FALSE);
}
}
所有BO操作都是事務性的。
的web.xml
<filter>
<filter-name>HibernateFilter</filter-name>
<filter-class>com.foo.bar.util.filters.MyOSIVFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
MyOSIVFilter是關閉會話這樣的OpenSessionInViewFilter的一個子類:
public void closeSession(Session session, SessionFactory sessionFactory){
session.flush();
super.closeSession(session,sessionFactory);
}
的hibernate.cfg.xml
<session-factory name="foo">
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="hibernate.connection.datasource">XXXXXXXXXX</property>
<property name="show_sql">yes</property>
<property name="hibernate.jdbc.batch_size">10</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="cache.use_query_cache">false</property>
<property name="hibernate.connection.autocommit">false</property>
<property name="hibernate.connection.release_mode">after_transaction</property>
的beans.xml(提取物)
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="read*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="insert*" propagation="REQUIRES_NEW" rollback-for="java.lang.Throwable" />
簡單的代碼
public void queryBusiness(){
MyObject obj = objDAO.find(111);
insertProcess1(obj);
insertProcess2(obj);
}
的問題:多的Hibernate Session被打開。日誌顯示OpenSessionInViewFilter會打開一個新會話,但是誰正在獲取其他會話?
剛指出,Struts2的是項目 – 2011-04-01 14:37:50
使用用於的OpenSessionInViewFilter和一個在DAO同一會話工廠? – Ralph 2011-04-01 14:55:43
請在這裏粘貼你的休眠配置... – Nilesh 2011-04-01 15:14:12