初学hibernate时,对于session中的update()和merge()两个方法,很容易搞混,以为两种都能用,有时候,又以为不知道该用哪种。数据库
实际上,这两个方法,是有很大区别的session
首先,对于一个处于detatch状态的实体对象来讲,要将其中的修改,合并到数据库中,有两种方法,一种方式,是调用update(),另外一种方式是调用merge()ide
当调用update()时,首先要确保目标session中,不包含一样id的实体对象的引用,若是有的话,会抛出异常,完成update()方法后,这个实体对象从detatch状态,转换为persistent状态,在session提交前,后续对其的修改,都会被合并到数据库中。hibernate
当调用merge()对象时,无需考虑session中是否已经包含一样id的实体对象,若是session中没有一样id的实体对象,hibernate会经过select语句,从数据库中查询出对应对象,若是数据库中没有对应对象,就新建一个。同时,完成merge()操做后,会返回数据库中对应的persistent状态对象,而原有的,做为参数传入的实体对象,仍然是detatch状态,后续代码对其的修改,没法合并到数据库中。若是session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例(把处于detatch的po对象A的属性copy到session当中处于持久态的po的属性中,执行完成后原来是持久状态仍是持久态,而咱们提供的A仍是原来状态)。对象