问题描述:
在Spring中使用hibernate进行事务处理时,如果出现以下情形,会报“org.hibernate.SessionException: Session is closed!”错误:
类A中的函数A1调用类B的函数B1,函数B1调用非事务函数B2和事务函数B3。类B和函数B1都没有进行事务声明(@Transactional(propagation=Propagation.REQUIRED,readOnly=false ))。
解决方案:
在一个类中,如果它的顶层函数下面有调用事务函数,则必须有Hibernate事务声明,否则就会有session closed exception. 而且,propagation是可以继承并重载的。
因此,一个类是一个session,如果想一劳永逸,就直接在类上方添加事务声明。或者,在含有事务函数的顶层函数上方添加事务声明。