Hibernate问题集锦

2017-04-21 17:25

问题一、No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

情景1:在service外使用了dao.getSession()从而导致问题。

解决思路:
其实我的Service层是加了@Transactional注解的,但是由于某些原因,在service外使用了dao.getSession()从而导致该问题。
问题代码如下:(这段代码没有放在被@Transactional注解的Serivce层,从而导致问题)

Criteria c=storeDao.getSession().createCriteria(Store.class).add(Restrictions.or(Restrictions.isNull("mainImgJson"),Restrictions.isNull("introImgJson")));
c.createAlias("terrace", "terrace").add(Restrictions.eq("terrace.keyId", "1"));
c.addOrder(Order.desc("updateTime"));
Page<Store> page=storeManager.findPage(c, 1, 100);

解决方法就是在这段代码调用方法上加上@Transactional注解。
参考:http://stackoverflow.com/ques...

情景2:Service[抽象]父类数据库方法没有加@Transactional
假设有以下类:

@Transactional
public class SubClass extends SuperClass {

    public void loadDb(){
//数据库操作
    }

}
public class SuperClass {

    public void savedb() {
//数据库操作
    }
}

savedb是父类的方法,loadDb是子类的方法。如果有以下调用:

@Test
public void test(){
    SubClass o = new SubClass();
    o.savedb();//将会报没有Session的错误
    o.loadDb();//正常
}

解决方法:在父类中标注@Transactional(父类是抽象类也可以):

@Transactional
public class SuperClass {

    public void savedb() {

    }
}

参考:http://www.cnblogs.com/xiefei...