Hibernate Save

hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思。我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原因。假如两个实体之间有关系(例如employee表和address表有一对一关系),如果在没有事务的情况下调用这个方法保存employee这个实体,除非调用flush()这个方法,否则仅仅employee实体会被保存。

Employee.java

为了方便理解,简化Employee.java的属性。

  1. /*
  2. * @(#)Employee.java Created on 2016年4月10日
  3. * Copyright (c) 2016. All rights reserved.
  4. */
  5. package nd.esp.com.hibernate.model;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.GeneratedValue;
  9. import javax.persistence.GenerationType;
  10. import javax.persistence.Id;
  11. import javax.persistence.OneToOne;
  12. import javax.persistence.Table;
  13. import org.hibernate.annotations.Cascade;
  14. @Entity
  15. @Table(name = "EMPLOYEE")
  16. public class Employee {
  17. @Id
  18. @GeneratedValue(strategy = GenerationType.IDENTITY)
  19. @Column(name = "emp_id")
  20. private long id;
  21. @Column(name = "emp_name")
  22. private String name;
  23. @OneToOne(mappedBy = "employee")
  24. @Cascade(value = org.hibernate.annotations.CascadeType.ALL)
  25. private Address address;
  26. public long getId() {
  27. return id;
  28. }
  29. public void setId(long id) {
  30. this.id = id;
  31. }
  32. public String getName() {
  33. return name;
  34. }
  35. public void setName(String name) {
  36. this.name = name;
  37. }
  38. public Address getAddress() {
  39. return address;
  40. }
  41. public void setAddress(Address address) {
  42. this.address = address;
  43. }
  44. @Override
  45. public String toString() {
  46. return "Employee [id=" + id + ", name=" + name + "]";
  47. }
  48. }

Address.java

为了方便理解,简化Address.java的属性。

  1. /*
  2. * @(#)Address.java Created on 2016年4月10日
  3. * Copyright (c) 2016. All rights reserved.
  4. */
  5. package nd.esp.com.hibernate.model;
  6. import javax.persistence.Column;
  7. import javax.persistence.Entity;
  8. import javax.persistence.GeneratedValue;
  9. import javax.persistence.Id;
  10. import javax.persistence.OneToOne;
  11. import javax.persistence.PrimaryKeyJoinColumn;
  12. import javax.persistence.Table;
  13. import org.hibernate.annotations.GenericGenerator;
  14. import org.hibernate.annotations.Parameter;
  15. @Entity
  16. @Table(name = "ADDRESS")
  17. public class Address {
  18. @Id
  19. @Column(name = "emp_id", unique = true, nullable = false)
  20. @GeneratedValue(generator = "gen")
  21. @GenericGenerator(name = "gen", strategy = "foreign", parameters = { @Parameter(name = "property", value = "employee") })
  22. private long id;
  23. @Column(name = "city")
  24. private String city;
  25. @OneToOne
  26. @PrimaryKeyJoinColumn
  27. private Employee employee;
  28. public long getId() {
  29. return id;
  30. }
  31. public void setId(long id) {
  32. this.id = id;
  33. }
  34. public String getCity() {
  35. return city;
  36. }
  37. public void setCity(String city) {
  38. this.city = city;
  39. }
  40. public Employee getEmployee() {
  41. return employee;
  42. }
  43. public void setEmployee(Employee employee) {
  44. this.employee = employee;
  45. }
  46. @Override
  47. public String toString() {
  48. return "Address [id=" + id + ", city=" + city + "]";
  49. }
  50. }

HibernateSaveExample.java

以下是简单的hibernate程序,演示save()方法的使用。

  1. /*
  2. * @(#)HibernateSaveExample.java Created on 2016年4月10日
  3. * Copyright (c) 2016. All rights reserved.
  4. */
  5. package nd.esp.com.hibernate.example;
  6. import nd.esp.com.hibernate.model.Address;
  7. import nd.esp.com.hibernate.model.Employee;
  8. import nd.esp.com.hibernate.utils.HibernateUtil;
  9. import org.hibernate.Session;
  10. import org.hibernate.SessionFactory;
  11. import org.hibernate.Transaction;
  12. public class HibernateSaveExample {
  13. public static void main(String[] args) {
  14. SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
  15. System.out.println("***********************************************");
  16. // save example - without transaction
  17. Session session = sessionFactory.openSession();
  18. Employee emp = getTestEmployee();
  19. long id = (Long) session.save(emp);
  20. System.out.println("1. Employee save called without transaction, id=" + id);
  21. session.flush(); // address will not get saved without this
  22. System.out.println("***********************************************");
  23. // save example - with transaction
  24. Transaction tx1 = session.beginTransaction();
  25. Session session1 = sessionFactory.openSession();
  26. Employee emp1 = getTestEmployee();
  27. long id1 = (Long) session1.save(emp1);
  28. System.out.println("2. Employee save called with transaction, id=" + id1);
  29. System.out.println("3. Before committing save transaction");
  30. tx1.commit();
  31. System.out.println("4. After committing save transaction");
  32. System.out.println("***********************************************");
  33. // save example - existing row in table
  34. Session session6 = sessionFactory.openSession();
  35. Transaction tx6 = session6.beginTransaction();
  36. Employee emp6 = (Employee) session6.load(Employee.class, new Long(3));
  37. // update some data
  38. System.out.println("Employee Details=" + emp6);
  39. emp6.setName("New Name");
  40. emp6.getAddress().setCity("New City");
  41. long id6 = (Long) session6.save(emp6);
  42. emp6.setName("New Name1"); // will get updated in database
  43. System.out.println("5. Employee save called with transaction, id=" + id6);
  44. System.out.println("6. Before committing save transaction");
  45. tx6.commit();
  46. System.out.println("7. After committing save transaction");
  47. System.out.println("***********************************************");
  48. // Close resources
  49. sessionFactory.close();
  50. }
  51. public static Employee getTestEmployee() {
  52. Employee emp = new Employee();
  53. Address add = new Address();
  54. emp.setName("Test Emp");
  55. add.setCity("Test City");
  56. emp.setAddress(add);
  57. add.setEmployee(emp);
  58. return emp;
  59. }
  60. }

执行上述示例程序,输出结果(第一次)。

  1. ***********************************************
  2. Hibernate: insert into EMPLOYEE (emp_name) values (?)
  3. 1. Employee save called without transaction, id=15
  4. Hibernate: insert into ADDRESS (city, emp_id) values (?, ?)
  5. ***********************************************
  6. Hibernate: insert into EMPLOYEE (emp_name) values (?)
  7. 2. Employee save called with transaction, id=16
  8. 3. Before committing save transaction
  9. 4. After committing save transaction
  10. ***********************************************
  11. Hibernate: select employee0_.emp_id as emp1_1_1_, employee0_.emp_name as emp2_1_1_, address1_.emp_id as emp1_0_0_, address1_.city as city2_0_0_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
  12. Employee Details=Employee [id=3, name=Test Emp]
  13. 5. Employee save called with transaction, id=3
  14. 6. Before committing save transaction
  15. Hibernate: update ADDRESS set city=? where emp_id=?
  16. Hibernate: update EMPLOYEE set emp_name=? where emp_id=?
  17. 7. After committing save transaction
  18. ***********************************************

执行上述示例程序,输出结果(第二次)。

  1. ***********************************************
  2. Hibernate: insert into EMPLOYEE (emp_name) values (?)
  3. 1. Employee save called without transaction, id=17
  4. Hibernate: insert into ADDRESS (city, emp_id) values (?, ?)
  5. ***********************************************
  6. Hibernate: insert into EMPLOYEE (emp_name) values (?)
  7. 2. Employee save called with transaction, id=18
  8. 3. Before committing save transaction
  9. 4. After committing save transaction
  10. ***********************************************
  11. Hibernate: select employee0_.emp_id as emp1_1_1_, employee0_.emp_name as emp2_1_1_, address1_.emp_id as emp1_0_0_, address1_.city as city2_0_0_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
  12. Employee Details=Employee [id=3, name=New Name1]
  13. 5. Employee save called with transaction, id=3
  14. 6. Before committing save transaction
  15. 7. After committing save transaction
  16. ***********************************************

从上述的输出可以得到以下重要的几点:

  • 应该避免在事务之外调用save()方法,否则关联实体(例如employee和address是一对一关系,相互关联)将不会被保存从而导致不一致。很容易忘记在最后调用flush()方法,因为不会有任务的异常或者警告抛出。
  • hibernate save()方法会立即返回id,原因很可能是调用save()的同时这个实体对象已经被写入数据库(立即执行sql语句insert into)
  • 提交事务或者调用flush()方法,save()方法才会将关联对象也写入数据库。
  • save()方法保存持久化状态的对象,hibernate会通过update操作完成。注意这个会发生在提交事务的时候。如果该持久化对象没有改变,hibernate不会发出update语句。如果多次运行示例程序HibernateSaveExample.java,会发现从第二次开始程序就不会发送update语句。因为hibernate在更新之前会先select,查询该持久化对象,发现该对象和数据库中的一致,就不会做update操作。

Hibernate Persist

hibernate persist()方法与save()方法(在事务中执行)类似,persist()方法会将实体对象添加到持久化上下文中,如此被保存的实体后续改变会被记录。如果在提交事务或者会话flush(),对象的属性被重新赋值,那么这个变化也会被保存到数据库中。

第二个不同在于persist()方法只能够在事务内执行,所以它能够很好地保证关联对象的安全与存储(原文:Second difference is that we can use persist() method only within the boundary of a transaction, so it’s safe and takes care of any cascaded objects.)。(发现原作者的第一点让人很疑惑,感觉是persist()不在事务中执行就会报错。经过测试,persist()在事务外运行不会报错,但是不会插入数据到数据库。原作者的意思可能是:persist()方法只能够在事务中被执行,才能够将数据插入到数据库中)

最后,persist()方法返回值是void,也就是说不会返回任何的值。

HibernatePersistExample.java

以下是简单的hibernate程序,演示persist()方法的使用。

  1. /*
  2. * @(#)HibernatePersistExample.java Created on 2016年4月10日
  3. * Copyright (c) 2016. All rights reserved.
  4. */
  5. package nd.esp.com.hibernate.example;
  6. import nd.esp.com.hibernate.model.Address;
  7. import nd.esp.com.hibernate.model.Employee;
  8. import nd.esp.com.hibernate.utils.HibernateUtil;
  9. import org.hibernate.Session;
  10. import org.hibernate.SessionFactory;
  11. import org.hibernate.Transaction;
  12. public class HibernatePersistExample {
  13. public static void main(String[] args) {
  14. // Prep Work
  15. SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
  16. System.out.println("***********************************************");
  17. // persist example - with transaction
  18. Session session2 = sessionFactory.openSession();
  19. Transaction tx2 = session2.beginTransaction();
  20. Employee emp2 = getTestEmployee();
  21. session2.persist(emp2);
  22. System.out.println("Persist called");
  23. emp2.setName("Kumar"); // will be updated in database too
  24. System.out.println("Employee Name updated");
  25. System.out.println("8. Employee persist called with transaction, id=" + emp2.getId() + ", address id="
  26. + emp2.getAddress().getId());
  27. tx2.commit();
  28. System.out.println("***********************************************");
  29. // Close resources
  30. sessionFactory.close();
  31. }
  32. public static Employee getTestEmployee() {
  33. Employee emp = new Employee();
  34. Address add = new Address();
  35. emp.setName("Test Emp");
  36. add.setCity("Test City");
  37. emp.setAddress(add);
  38. add.setEmployee(emp);
  39. return emp;
  40. }
  41. }

执行上述示例程序,输出结果。

  1. ***********************************************
  2. Hibernate: insert into EMPLOYEE (emp_name) values (?)
  3. Persist called
  4. Employee Name updated
  5. 8. Employee persist called with transaction, id=19, address id=19
  6. Hibernate: insert into ADDRESS (city, emp_id) values (?, ?)
  7. Hibernate: update EMPLOYEE set emp_name=? where emp_id=?
  8. ***********************************************

需要注意,第一次employee对象被插入数据库,提交事务的时候执行address实体的插入操作,由于employee实体name属性重新赋值,所以执行update操作。

Hibernate saveOrUpdate

hibernate saveOrUpdate()方法会执行插入或者更新操作。如果该对象在数据库中已经存在则更新,不存在则插入。

saveOrUpdate()方法可以在没有事务的情况下执行,但是如果没有手动调用flush()方法会面临关联对象不被保存的问题

save()方法与saveOrUpdate()方法最大的不同点在于,saveOrUpdate()方法会将实体对象添加到持久化上下文中,该实体的后续改变会被跟踪。

HibernateSaveOrUpdateExample.java

以下是简单的hibernate程序,演示saveOrUpdate()方法的使用。

  1. /*
  2. * @(#)HibernateSaveOrUpdateExample.java Created on 2016年4月10日
  3. * Copyright (c) 2016. All rights reserved.
  4. */
  5. package nd.esp.com.hibernate.example;
  6. import nd.esp.com.hibernate.model.Address;
  7. import nd.esp.com.hibernate.model.Employee;
  8. import nd.esp.com.hibernate.utils.HibernateUtil;
  9. import org.hibernate.Session;
  10. import org.hibernate.SessionFactory;
  11. import org.hibernate.Transaction;
  12. public class HibernateSaveOrUpdateExample {
  13. public static void main(String[] args) {
  14. // Prep Work
  15. SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
  16. System.out.println("***********************************************");
  17. // saveOrUpdate example - without transaction
  18. Session session5 = sessionFactory.openSession();
  19. Employee emp5 = getTestEmployee();
  20. session5.saveOrUpdate(emp5);
  21. System.out.println("***********************************************");
  22. // saveOrUpdate example - with transaction
  23. Session session3 = sessionFactory.openSession();
  24. Transaction tx3 = session3.beginTransaction();
  25. Employee emp3 = getTestEmployee();
  26. session3.saveOrUpdate(emp3);
  27. emp3.setName("Kumar"); // will be saved into DB
  28. System.out.println("9. Before committing saveOrUpdate transaction. Id=" + emp3.getId());
  29. tx3.commit();
  30. System.out.println("10. After committing saveOrUpdate transaction");
  31. System.out.println("***********************************************");
  32. Transaction tx4 = session3.beginTransaction();
  33. emp3.setName("Updated Test Name"); // Name changed
  34. emp3.getAddress().setCity("Updated City");
  35. session3.saveOrUpdate(emp3);
  36. emp3.setName("Kumar"); // again changed to previous value, so no Employee update
  37. System.out.println("11. Before committing saveOrUpdate transaction. Id=" + emp3.getId());
  38. tx4.commit();
  39. System.out.println("12. After committing saveOrUpdate transaction");
  40. System.out.println("***********************************************");
  41. // Close resources
  42. sessionFactory.close();
  43. }
  44. public static Employee getTestEmployee() {
  45. Employee emp = new Employee();
  46. Address add = new Address();
  47. emp.setName("Test Emp");
  48. add.setCity("Test City");
  49. emp.setAddress(add);
  50. add.setEmployee(emp);
  51. return emp;
  52. }
  53. }

执行上述示例程序,输出结果。

  1. ***********************************************
  2. Hibernate: insert into EMPLOYEE (emp_name) values (?)
  3. ***********************************************
  4. Hibernate: insert into EMPLOYEE (emp_name) values (?)
  5. 9. Before committing saveOrUpdate transaction. Id=21
  6. Hibernate: insert into ADDRESS (city, emp_id) values (?, ?)
  7. Hibernate: update EMPLOYEE set emp_name=? where emp_id=?
  8. 10. After committing saveOrUpdate transaction
  9. ***********************************************
  10. 11. Before committing saveOrUpdate transaction. Id=21
  11. Hibernate: update ADDRESS set city=? where emp_id=?
  12. 12. After committing saveOrUpdate transaction
  13. ***********************************************

注意如果没有事务,仅仅是employee实体被保存到数据库,而address的信息丢失了。

在事务tx4中的几行代码employee实体的name属性先被修改为“Updated Test Name”,之后又被赋值为原来的值“Kumar”,因此employee这个实体在事务提交之前并没有改变,所以并没有update操作。

Hibernate update

当确定只更新实体信息时使用Hibernate update()方法。update()方法会将实体添加到持久化上下文,实体后续的改变会被跟踪并且当事务提交时这些改变会被保存到数据库中。

HibernateUpdateExample.java

以下是简单的hibernate程序,update()方法的使用。

  1. /*
  2. * @(#)HibernateUpdateExample.java Created on 2016年4月10日
  3. * Copyright (c) 2016. All rights reserved.
  4. */
  5. package nd.esp.com.hibernate.example;
  6. import nd.esp.com.hibernate.model.Employee;
  7. import nd.esp.com.hibernate.utils.HibernateUtil;
  8. import org.hibernate.Session;
  9. import org.hibernate.SessionFactory;
  10. import org.hibernate.Transaction;
  11. public class HibernateUpdateExample {
  12. public static void main(String[] args) {
  13. // Prep Work
  14. SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
  15. System.out.println("***********************************************");
  16. Session session = sessionFactory.openSession();
  17. Transaction tx = session.beginTransaction();
  18. Employee emp = (Employee) session.load(Employee.class, new Long(19));
  19. System.out.println("Employee object loaded. " + emp);
  20. tx.commit();
  21. System.out.println("***********************************************");
  22. // update example
  23. emp.setName("Updated name");
  24. emp.getAddress().setCity("Bangalore");
  25. Transaction tx7 = session.beginTransaction();
  26. session.update(emp);
  27. emp.setName("Final updated name");
  28. System.out.println("13. Before committing update transaction");
  29. tx7.commit();
  30. System.out.println("14. After committing update transaction");
  31. System.out.println("***********************************************");
  32. // Close resources
  33. sessionFactory.close();
  34. }
  35. }

执行上述示例程序,输出结果(第一次)。

  1. ***********************************************
  2. Hibernate: select employee0_.emp_id as emp1_1_1_, employee0_.emp_name as emp2_1_1_, address1_.emp_id as emp1_0_0_, address1_.city as city2_0_0_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
  3. Employee object loaded. Employee [id=19, name=Kumar]
  4. ***********************************************
  5. 13. Before committing update transaction
  6. Hibernate: update ADDRESS set city=? where emp_id=?
  7. Hibernate: update EMPLOYEE set emp_name=? where emp_id=?
  8. 14. After committing update transaction
  9. ***********************************************

执行上述示例程序,输出结果(第二次)。

  1. ***********************************************
  2. Hibernate: select employee0_.emp_id as emp1_1_1_, employee0_.emp_name as emp2_1_1_, address1_.emp_id as emp1_0_0_, address1_.city as city2_0_0_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
  3. Employee object loaded. Employee [id=19, name=Final updated name]
  4. ***********************************************
  5. 13. Before committing update transaction
  6. 14. After committing update transaction
  7. ***********************************************

注意第二次运行并没有执行update操作,因为employee实体与数据库中的一致。还有语句:

  1. session.update(emp);
  2. emp.setName("Final updated name");

修改employee实体name属性值为:“Final updated name”,是在update()方法之后,而最后保存到数据库中是“Final updated name”,表明hibernate update()方法会跟踪实体的改变,在提交事务时保存到数据库中。

Hibernate Merge

hibernate merge()方法被用于更新数据库中的记录,然而merge()方法通过创建一个传递进来的实体对象副本并且将这个副本作为返回值返回。返回值属于持久化上下文,能够跟踪实体的改变,而传递进来的实体并不能被跟踪。这一点是merge()方法与其他方法最大的不同。

HibernateMergeExample.java

以下是简单的hibernate程序,merge()方法的使用。

  1. /*
  2. * @(#)HibernateMergeExample.java Created on 2016年4月10日
  3. * Copyright (c) 2016. All rights reserved.
  4. */
  5. package nd.esp.com.hibernate.example;
  6. import nd.esp.com.hibernate.model.Employee;
  7. import nd.esp.com.hibernate.utils.HibernateUtil;
  8. import org.hibernate.Session;
  9. import org.hibernate.SessionFactory;
  10. import org.hibernate.Transaction;
  11. public class HibernateMergeExample {
  12. public static void main(String[] args) {
  13. // Prep Work
  14. SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
  15. System.out.println("***********************************************");
  16. Session session = sessionFactory.openSession();
  17. Transaction tx = session.beginTransaction();
  18. Employee emp = (Employee) session.load(Employee.class, new Long(19));
  19. System.out.println("Employee object loaded. " + emp);
  20. tx.commit();
  21. System.out.println("***********************************************");
  22. // merge example - data already present in tables
  23. emp.setName("test1");
  24. Transaction tx8 = session.beginTransaction();
  25. Employee emp4 = (Employee) session.merge(emp);
  26. System.out.println(emp4 == emp); // returns false
  27. emp.setName("test2");
  28. emp4.setName("merge");
  29. System.out.println("15. Before committing merge transaction");
  30. tx8.commit();
  31. System.out.println("16. After committing merge transaction");
  32. System.out.println("***********************************************");
  33. // Close resources
  34. sessionFactory.close();
  35. }
  36. }

执行上述示例程序,输出结果(第一次)。

  1. ***********************************************
  2. Hibernate: select employee0_.emp_id as emp1_1_1_, employee0_.emp_name as emp2_1_1_, address1_.emp_id as emp1_0_0_, address1_.city as city2_0_0_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
  3. Employee object loaded. Employee [id=19, name=Kumar]
  4. ***********************************************
  5. false
  6. 15. Before committing merge transaction
  7. Hibernate: update EMPLOYEE set emp_name=? where emp_id=?
  8. 16. After committing merge transaction
  9. ***********************************************

执行上述示例程序,输出结果(第二次)。

  1. ***********************************************
  2. Hibernate: select employee0_.emp_id as emp1_1_1_, employee0_.emp_name as emp2_1_1_, address1_.emp_id as emp1_0_0_, address1_.city as city2_0_0_ from EMPLOYEE employee0_ left outer join ADDRESS address1_ on employee0_.emp_id=address1_.emp_id where employee0_.emp_id=?
  3. Employee object loaded. Employee [id=19, name=merge]
  4. ***********************************************
  5. false
  6. 15. Before committing merge transaction
  7. 16. After committing merge transaction
  8. ***********************************************

注意merge()方法传递进入的实体与返回值实体是不一样的,

  1. Employee emp4 = (Employee) session.merge(emp);
  2. emp.setName("test2");
  3. emp4.setName("merge");

上述代码会将employee表的name属性赋值为“merge”,因为返回实体emp4属于持久化上下文,会被跟踪改变。

以上内容翻译自http://www.journaldev.com/3481/hibernate-save-vs-saveorupdate-vs-persist-vs-merge-vs-update-explanation-with-examples。例子代码做了一点简化,并且工程化,可以在如下地址找到上述例子工程:https://github.com/xiaoheike/HibernateSavePersistUpdateMergeDiff

总结

save()方法:

  • 应该避免在事务之外调用save()方法,否则关联实体(例如employee和address是一对一关系,相互关联)将不会被保存从而导致不一致。很容易忘记在最后调用flush()方法,因为不会有任务的异常或者警告抛出。
  • hibernate save()方法会立即返回id,原因很可能是调用save()的同时这个实体对象已经被写入数据库(立即执行sql语句insert into)
  • 提交事务或者调用flush()方法,save()方法才会将关联对象也写入数据库。

persist()方法:

  • persist()方法会将实体对象添加到持久化上下文中,如此被保存的实体后续改变会被记录。如果在提交事务或者会话flush(),对象的属性被重新赋值,那么这个变化也会被保存到数据库中。
  • persist()方法必须在事务内执行,才能够将数据插入数据库。如果不在事务范围内执行,数据将丢失。
  • 最后,persist()方法返回值是void,也就是说不会返回任何的值。

saveOrUpdate()方法:

  • hibernate saveOrUpdate()方法会执行插入或者更新操作。如果该对象在数据库中已经存在则更新,不存在则插入。
  • saveOrUpdate()方法可以在没有事务的情况下执行,但是如果没有手动调用flush()方法会面临关联对象不被保存的问题
  • save()方法与saveOrUpdate()方法最大的不同点在于,saveOrUpdate()方法会将实体对象添加到持久化上下文中,该实体的后续改变会被跟踪。

update()方法:

  • 当确定只更新实体信息时使用Hibernate update()方法。update()方法会将实体添加到持久化上下文,实体后续的改变会被跟踪并且当事务提交时这些改变会被保存到数据库中
  • hibernate update()方法会跟踪实体的改变,在提交事务时保存到数据库中。

merge()方法:

  • hibernate merge()方法被用于更新数据库中的记录,然而merge()方法通过创建一个传递进来的实体对象副本并且将这个副本作为返回值返回。返回值属于持久化上下文,能够跟踪实体的改变,而传递进来的实体并不能被跟踪。这一点是merge()方法与其他方法最大的不同。

转载自:https://www.cnblogs.com/xiaoheike/p/5374613.html

【hibernate】Hibernate中save, saveOrUpdate, persist, merge, update 区别的更多相关文章

  1. Hibernate save, saveOrUpdate, persist, merge, update 区别

    Hibernate Save hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思.我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原 ...

  2. hibernate中save()、update()、saveOrUpdate()的区别

    save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象. update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用 ...

  3. Hibernate save()、saveOrUpdate()、merge()的区别

    一. update 和 merge的区别 首先在执行更新操作的时候,两者都必须要有id update是直接执行update 语句,执行后状态为持久化状态 而merge则不一样: 1. 如果sessio ...

  4. Hibernate中saveOrUpdate()和merge()的区别

    this.getSession().merge(obj); this.getSession().saveOrUpdate(obj); saveOrUpdate(): saveOrUpdate()基本上 ...

  5. save()、saveOrUpdate()、merge()的区别

    一.Save() save()方法能够保存实体到数据库.假如两个实体之间有关系(例如employee表和address表有一对一关系),如果在没有事务的情况下调用这个方法保存employee这个实体, ...

  6. saveOrupdate和 merge的区别

    merge和saveOrUpdate方法区别在于:merge方法是把我们提供的对象转变为托管状态的对象:而saveOrUpdate则是把我们提供的对象变成一个持久化对象:说的通俗一点就是:saveOr ...

  7. Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析

    Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计 ...

  8. Hibernate里save(),saveOrUpdate(),merge(),update()的区别

    save()方法用于将一个临时对象转变为持久化对象,也就是将一个新的业务实体保存到数据库中:update()方法用于将一个游离对象重新转变为持久化对象,也就是更新一个已经存在的业务实体到数据库中:sa ...

  9. Hibernate中save、saveorupdate、persist方法的区别

    在Hibernate中,save().saveOrUpdate()和persist()都是用于将对象保存到数据库中的方法,但其中有些细微的差别.例如,save()只能INSERT记录,但是saveOr ...

随机推荐

  1. day01_09.你已学会编程

    目前你已经学会编程: 学会变量,运算,控制,你就学会了编程,我擦?真的,假的? 1.打印1-100,自己试试看呗 <?php $num = 1; while($num<=100){ ech ...

  2. jquery拼接字符串

    1. $("#div").append("<table><tr align='center'>" +"<td >& ...

  3. “玲珑杯”ACM比赛 Round #23

    A -- 生是脂肪的人 Time Limit:2s Memory Limit:128MByte Submissions:263Solved:97 DESCRIPTION 给定一个整数n,输出[(10^ ...

  4. 使用PHPExcel单元格样式添加不上的原因

    按照文档上的样式设置方法设置样式,一直不成功.后来发现是得要在创建了sheet,并选择某一个sheet作为活动sheet后再设置才可以.这里记录一下.

  5. Oracle 用户和权限

    Oracle 用户和权限Oracle 中,一般不会轻易在一个服务器上创建多个数据库,在一个数据库中,不同的项目由不同的用户访问,每一个用户拥有自身创建的数据库对象,因此用户的概念在 Oracle中非常 ...

  6. layer弹窗在键盘按回车将反复刷新

      条件:弹窗后不做任何点击操作或者聚焦操作对于layer.load,弹出后反复按回车,load层将不断刷新,即使设置了自动消失也只有等不按回车键才会生效.对于layer iframe层有表单就更糟糕 ...

  7. RabbitMQ的应用场景以及基本原理介绍(转)

    1.背景 RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现. 2.应用场景 2.1异步处理 场景说明:用户注册后,需要发注册邮件和注册短信, ...

  8. iOS开发,最新判断是否是手机号的正则表达式

    最近项目里需要判断是否为手机号并发送验证码的功能,一下是实现方法.不过这个方法还是有些不足,只能判断输入的11位数的号段是否正确,无法判断手机号是否存在.不过勉强可以使用! + (NSString * ...

  9. [NOIP2017] 逛公园 (最短路,动态规划&记忆化搜索)

    题目链接 Solution 我只会60分暴力... 正解是 DP. 状态定义: \(f[i][j]\) 代表 \(1\) 到 \(i\) 比最短路长 \(j\) 的方案数. 那么很显然最后答案也就是 ...

  10. cf496D Tennis Game

    Petya and Gena love playing table tennis. A single match is played according to the following rules: ...