1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public
static
void
addStudent(){
sessionFactory=
new
AnnotationConfiguration().configure().buildSessionFactory();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
Student student=
new
Student(
"李四"
,
34
);
session.save(student);
student.setName(
"王五"
);
Iterator<Student> iterator=(Iterator<Student>) session.createQuery(
"from Student"
).iterate();
while
(iterator.hasNext()){
System.out.println(iterator.next().toString());
}
session.getTransaction().commit();
}
|
注意
1
2
|
session.save(student);
student.setName(
"王五"
);
|
session持久化了实体后,只是写入了session缓存中,commit前并没有写入数据库中,此时再改变
实体,保存到数据库的实体为修改过的实体。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
static
void
updateStudent(){
sessionFactory=
new
AnnotationConfiguration().configure().buildSessionFactory();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
Student student=(Student) session.get(Student.
class
,
2
);
student.setName(
"update"
);
Iterator<Student> iterator=(Iterator<Student>) session.createQuery(
"from Student"
).iterate();
while
(iterator.hasNext()){
System.out.println(iterator.next().toString());
}
session.getTransaction().commit();
}
|
从数据库中查找id为2的记录后,此时session缓存中有了实体,直接修改实体的值,不用update,session提交后,数据库的记录依然被修改了
对于先查询再修改,
不写update,merge和
session.update(student);
session.merge(student);
都是一样的,commit后数据都会写入数据库
1
2
|
Student student=
new
Student(
10
,
"update"
,
100
);
session.update(student);
|
直接new一个实体(其id=10的记录在数据库中不存在),直接update报错
1
|
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [
0
]; actual row count:
0
; expected:
1
|
此Student对象的id设置了自增,其id=10的记录在数据库中不存在,
1
2
|
Student student=
new
Student(
10
,
"update"
,
100
);
session.merge(student);
|
结果数据库保存了记录,但是id不为10,而是按照自增的结果,为6(插入前最大为5)
1
2
|
Student student=
new
Student(
11
,
"update"
,
100
);
session.saveOrUpdate(student);
|
而想象中可以完成此操作的saveOrUpdate()却也报错
1
|
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [
0
]; actual row count:
0
; expected:
1
|
1
2
3
4
5
6
7
8
|
Hibernate:
update
Student
set
age=?,
name=?
where
id=?
|
发出的sql竟然是update,怎么不是save,应该是自动选择才对?
本文转自 matengbing 51CTO博客,原文链接:http://blog.51cto.com/matengbing/1876692