`

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。

 

二、未完待续- - !

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics