hibernate merge跟saveorupdate、persist和save
hibernate merge和saveorupdate、persist和save
一直很纳闷这个merge和persist方法,平时也很少用。今天研究下总结下
一、merge 翻译:合并;融合
其实merge方法很简单,看代码。
@Entity public class Father { @Id @GeneratedValue private int id; private String name;
唯一一个father实体类,执行session.merge(father)方法时,首先会查看father的id是否为空,
1.要是为空的话那就直接执行insert语句将father持久化,结束。
2.要是不为空,那么先执行select的语句查询father表中id为这个father.id的记录是否存在
A:存在,那好执行update语句,结束。
B:不存在,那么执行inset语句,结束。
很简单吧。
但是有一点要注意,看代码;
@Test public void testChildSave() { Father f = new Father(); f.setId(7); f.setName("父亲1"); Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); session.merge(f); session.getTransaction().commit(); System.out.println(f.getId()); }
先说明在执行这段代码之前,father表没有任何记录。 按照上面的流程,先执行select语句,然后执行insert语句
这是控制台给出的hibernate的sql语句
Hibernate: select father0_.id as id1_0_, father0_.name as name1_0_ from Father father0_ where father0_.id=? Hibernate: insert into Father (name) values (?) 7
注意看最后的一个7,这是我们之前set的id,但是数据库的记录下对应的id是1;也就是说father对象经过merge方法后没有任何的变化,一直是一个transient状态。所以要注意,一个对象经过merge后它和数据库不一定一致。
现在我们来看看saveorupdate方法,这个方法也很简单,它会根据对象的id是否为空来决定进行inset或者update,
为空就inset,不为空就update,任何情况下都不会执行select语句,所以在update一个数据库不存在的id时会有Exception。
二、未完待续- - !