Note that there are some explanatory texts on larger screens.

plurals
  1. POOpenSessionInViewFilter and custom spring DAO
    primarykey
    data
    text
    <p>I've coded a custom generic DAO in this way:</p> <pre><code>public abstract class DAOImpl&lt;T, PK extends Serializable&gt; implements DAO&lt;T, PK&gt; { private SessionFactory sessionFactory; protected Logger log = null; private Class&lt;T&gt; type; public DAOImpl(Class&lt;T&gt; 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); } } </code></pre> <p>All BO operations are transactional.</p> <p>web.xml</p> <pre><code>&lt;filter&gt; &lt;filter-name&gt;HibernateFilter&lt;/filter-name&gt; &lt;filter-class&gt;com.foo.bar.util.filters.MyOSIVFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;param-name&gt;sessionFactoryBeanName&lt;/param-name&gt; &lt;param-value&gt;sessionFactory&lt;/param-value&gt; &lt;/init-param&gt; &lt;/filter&gt; </code></pre> <p>MyOSIVFilter is a subclass of OpenSessionInViewFilter that closes sessions in this way:</p> <pre><code>public void closeSession(Session session, SessionFactory sessionFactory){ session.flush(); super.closeSession(session,sessionFactory); } </code></pre> <p>hibernate.cfg.xml</p> <pre><code>&lt;session-factory name="foo"&gt; &lt;property name="hibernate.connection.driver_class"&gt;oracle.jdbc.driver.OracleDriver&lt;/property&gt; &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.Oracle9Dialect&lt;/property&gt; &lt;property name="hibernate.connection.datasource"&gt;XXXXXXXXXX&lt;/property&gt; &lt;property name="show_sql"&gt;yes&lt;/property&gt; &lt;property name="hibernate.jdbc.batch_size"&gt;10&lt;/property&gt; &lt;property name="hibernate.cache.use_second_level_cache"&gt;false&lt;/property&gt; &lt;property name="cache.use_query_cache"&gt;false&lt;/property&gt; &lt;property name="hibernate.connection.autocommit"&gt;false&lt;/property&gt; &lt;property name="hibernate.connection.release_mode"&gt;after_transaction&lt;/property&gt; </code></pre> <p>beans.xml (extract)</p> <pre><code>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt; &lt;property name="configLocation" value="classpath:hibernate.cfg.xml" /&gt; &lt;/bean&gt; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; &lt;property name="sessionFactory" ref="sessionFactory" /&gt; &lt;/bean&gt; &lt;tx:advice id="txAdvice" transaction-manager="transactionManager"&gt; &lt;tx:attributes&gt; &lt;tx:method name="get*" read-only="true" /&gt; &lt;tx:method name="read*" read-only="true"/&gt; &lt;tx:method name="query*" read-only="true"/&gt; &lt;tx:method name="insert*" propagation="REQUIRES_NEW" rollback-for="java.lang.Throwable" /&gt; </code></pre> <p>simple code</p> <pre><code>public void queryBusiness(){ MyObject obj = objDAO.find(111); insertProcess1(obj); insertProcess2(obj); } </code></pre> <p>The problem: multiple Hibernate sessions are opened. Logs show OpenSessionInViewFilter opens a new session but, who is getting the other ones?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload