Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第二次调用方法后,在spring事务中关闭Hibernate会话_Java_Spring_Hibernate_Transactions - Fatal编程技术网

Java 第二次调用方法后,在spring事务中关闭Hibernate会话

Java 第二次调用方法后,在spring事务中关闭Hibernate会话,java,spring,hibernate,transactions,Java,Spring,Hibernate,Transactions,首先,我是spring的初学者。我创建了一个简单的spring服务,它注入了DAO,事务由spring的HibernateTransactionManager管理,如下所示。(事务配置使用注释) 我的事务配置如下 <bean id="txMgr" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="

首先,我是spring的初学者。我创建了一个简单的spring服务,它注入了DAO,事务由spring的HibernateTransactionManager管理,如下所示。(事务配置使用注释)

我的事务配置如下

<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" />
编辑: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;
    }
抽象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;
公共抽象类generichBernateDao
实现GenericDAO{
私有类persistentClass;
受保护会话;
@自动连线
私人会话工厂会话工厂;

您的ObjectDao需要一个SessionFactory和注释事务。如下所示:

@Component
public class userDao{
       @AutoWired
       private SessionFactory sessionFactory;


       @Transactional
       public User findByIdAndPassword(String id , String password){
             ....
       }

       {getters and setters}

} 
不要那样做:

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

    return session;
}
只需返回当前会话,事务性注释负责打开和关闭会话,如下所示:

protected Session getSession() {
    return  sessionFactory.getCurrentSession();
}

调用DAO时引发异常。向我们显示DAO。此外,请删除注释TransactionConfiguration。此注释用于DAO集成测试中,而不用于生产代码中(在生产代码中它是无用的,被Spring忽略).编辑并包含DAO我已经这样做了,正如我所说,它第一次执行成功。第二次调用后它会中断。不要询问SessionFactory的值,是否为null。只需返回currentSession、@Transactional close and open sessions。谢谢萨克,我找到了解决方案。关于getSession()你说得对.我在getSession中做得不对
@Component
public class userDao{
       @AutoWired
       private SessionFactory sessionFactory;


       @Transactional
       public User findByIdAndPassword(String id , String password){
             ....
       }

       {getters and setters}

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

    return session;
}
protected Session getSession() {
    return  sessionFactory.getCurrentSession();
}