1.用来更新detached对象,更新完后转为persistent状态
Session session = sf.getCurrentSession();
Transaction t = session.beginTransaction();
Teacher teacher = (Teacher) session.get(Teacher.class, 1);
t.commit();
teacher.setName("张三");
Session session2 = sf.getCurrentSession();
Transaction t2 = session2.beginTransaction();
session2.update(teacher);
t2.commit();
2.更新有或者没有id的transient对象不会报错(不管这个id在数据库中有没有对应的数据)。
Teacher teacher = new Teacher();
teacher.setId(1);
teacher.setName("张三");
Session session = sf.getCurrentSession();
Transaction t = session.beginTransaction();
session.update(teacher);
t.commit();
注:更新有id的transient对象(在数据库中有对应的数据),除了设置的成员变量外,其他的都是空值。
3.更新部分字段:
1)XML设定property标签的update属性为true,annotation设定@Column的updatable属性为true(不灵活,很少用)
2)使用XML中的dynamic-update,JPA annotation没有对应的属性(同一个session可以,跨session不行,不过可以用marge)
Session session = sf.getCurrentSession();
Transaction t = session.beginTransaction();
Student student = (Student) session.get(Student.class, 1);
student.setName("张三");
t.commit();
Session session = sf.getCurrentSession();
Transaction t = session.beginTransaction();
Student student = (Student) session.get(Student.class, 1);
student.setName("张三");
t.commit();
student.setName("李四");
Session session2 = sf.getCurrentSession();
Transaction t2 = session2.beginTransaction();
session2.update(student);//session2.merge(student);
t2.commit();
注:merge这里执行时,会再次执行sql查询语句,然后更新
3)使用HQL语句进行更新
Session session = sf.getCurrentSession();
Transaction t = session.beginTransaction();
Query q = session.createQuery("update Student s set s.name='张三' where id = 1");
q.executeUpdate();
t.commit();