1

まずはSpring初心者ですが、以下のようにDAOを注入しSpringのHibernateTransactionManagerでトランザクションを管理するシンプルなSpringサービスを作成しました。

@Service(value="daopowered")
public class UserServiceImplDao implements UserService
    {
    @Inject
    private UserDao userDao;


    @Override
    @Transactional
    public User autheticate( String userId, String password )
    {
    return userDao.findByIdAndPassword(userId, password);
    } 

私のトランザクション構成は次のとおりです

<bean id="txMgr"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="txMgr" />

問題は、コントローラーを使用して初めて認証メソッドを呼び出すと、正常に動作します(DB操作は正常に機能します)が、2回目に呼び出した後、休止状態セッションが閉じられ、例外が発生しますか? 私が間違っていること、またはこのシナリオを処理する方法を教えてください。このメソッドを 2 回目に呼び出したときに、Spring が新しいトランザクションを開かないのはなぜですか?

例外トレース:

2013-05-22T21:04:18.041+0530 DEBUG [14208212-2] lerExceptionResolver Resolving exception from handler [com.akhi.store.controller.HomeController@5d9d277e]: org.springframework.orm.hibernate3.HibernateSystemException: Session is closed!; nested exception is org.hibernate.SessionException: Session is closed!
2013-05-22T21:04:18.044+0530 DEBUG [14208212-2] tusExceptionResolver Resolving exception from handler [com.akhi.store.controller.HomeController@5d9d277e]: org.springframework.orm.hibernate3.HibernateSystemException: Session is closed!; nested exception is org.hibernate.SessionException: Session is closed!
2013-05-22T21:04:18.044+0530 DEBUG [14208212-2] lerExceptionResolver Resolving exception from handler [com.akhi.store.controller.HomeController@5d9d277e]: org.springframework.orm.hibernate3.HibernateSystemException: Session is closed!; nested exception is org.hibernate.SessionException: Session is closed!
2013-05-22T21:04:18.046+0530 DEBUG [14208212-2] et.DispatcherServlet Could not complete request
org.springframework.orm.hibernate3.HibernateSystemException: Session is closed!; nested exception is org.hibernate.SessionException: Session is closed!
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:658)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.convertHibernateAccessException(AbstractSessionFactoryBean.java:245)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.translateExceptionIfPossible(AbstractSessionFactoryBean.java:224)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at com.sun.proxy.$Proxy28.findByIdAndPassword(Unknown Source)

編集:DAOコード

@Repository
public class UserDaoImpl extends GenericHibernateDAO<User, Long>
                                implements
                                UserDao
    {

    @Override
    public User findByIdAndPassword( String id, String password )
    {

    Criteria crit = getSession().createCriteria(User.class).add(Restrictions.eq("userId",
                                            id)).add(Restrictions.eq("password",
                                                         password)).setMaxResults(1);
    List<?> list = crit.list();

    if (list.size() > 0)
        return (User) list.get(0);
    else
        return null;
    }

getSession() の実装は

protected Session getSession() {
    if (session == null) {
        session = sessionFactory.getCurrentSession();
    }

    return session;
}

また、抽象DAOクラスにはsessionfactoryが注入されています

public abstract class GenericHibernateDAO<T, ID extends Serializable>
        implements GenericDAO<T, Long> {
    private Class<T> persistentClass;

    protected Session session;

    @Autowired
    private SessionFactory sessionFactory;
4

1 に答える 1