hibernacle添加方法与缓存是很有意思的一件事,前一段时间做项目遇到了。下面看列子:
@Primary @Repository("baseDao") public class BaseDaoImpl<T> implements BaseDao<T> { @Autowired private SessionFactory sessionFactory; private SessionFactory getSessionFactory() { return sessionFactory; } private Session getCurrentSession() { return sessionFactory.getCurrentSession();//得到当前的session } public Serializable save(T t,Puser puser) { Serializable s = this.getCurrentSession().save(this.getCurrentSession().merge(t)); setLog(t, "新增", puser); return s; } public void update(T t,Puser puser) { this.getCurrentSession().update(this.getCurrentSession().merge(t)); setLog(t, "更新",puser); } }
Serializable s = this.getCurrentSession().save(this.getCurrentSession().merge(t));
观察这一句,save方法当中有一个merge方法,这个方法是从hibernate缓存当中去寻找(根据这个对象的主键去寻找),如果再缓存当中找到了则替换缓存当中的对象并且保存到数据库当中,这样一种情况下即使两个对象的主键相同也不会报主键冲突异常,仅仅是替换而已。
如果想要数据库的主键约束生效该怎么办?
Serializable s = this.getCurrentSession().save(t);
直接放入t,如果是这样hibernate不会去缓存里面去寻找,而是直接存入数据库。