1.如是有实体或实体类属性叫group,那么不能叫group,因为和数据库中的关键字冲突,必须重新命名
2.如果某个对象的id生成策略为uuid的话,当调用了session.save()方法时,其就id有值了,并纳入了
session缓存中,但并没有发出insert,session的existsInDatabase属性为false,此时数据库中没有数据
3.当调用session.flush()时,就会清理缓存,执行sql语句,如果数据库的隔离级别设为read uncommitted的话,就
可以看到flush的数据,这时session的existsInDatabase属性为true ,并会把session的insertions集体清空,
此时数据库中有数据,但flush并不提交事务,
所以是可以回滚的
4.调用tx.commit()时,会首先调用session.flush()
5.如果对象的id生成策略为native时,当调用session.save()时,就会发出sql语句,数据库中有数据,existsInDatabase
属性为true,并纳入了session管理
相当于调用了session.flush()
6.当调用session.evit()时,对象就会从session的EntityEntries属性中清除
如:
session.save(user);
session.evit(user);
tx.commit();
此是无法成功提交,因为hibernate在清现缓存时,在session的insertions集合中取出的user对象进行insert操作后
需要更新entityEntries属性中的existsInDatabase为true,而调用了session.evit(user)已经将user从session的entityEntries
中清除了,找不数据,无法更新,就会抛出异常
解决方法:
session.save(user);
session.flush();
session.evit(user);
tx.commit();
7.hibernate按照save(insert),update、delete顺序提交相关操作,如果想改变其顺序,就调用session.update()来改变