Hibernate实体对象的三种状态
2017-09-25 17:19
344 查看
对象状态:
一般来说,new 出来的与 session 没有关联,是瞬时状态。但是,如果故意地将 new 出来的一个对象按照数据库中的某条记录赋值,那么这个对象也就成为脱管状态,因为已经有数据和它对应了。可以直接用这个对象对数据库进行对应记录的 delete、update 操作。并且,delete 和 update 的时候,只要主键与数据库中的记录相同即可,其他属性不需要相同。
实验:
public static void main(String[] args) {
Session s = HibernateUtil. getSession();
StudentInfo studentInfo = new StudentInfo();
studentInfo.setBirthday( new Date());
studentInfo.setName( "Gong");
addStudentInfo( studentInfo);
System. out.println( "id="+ studentInfo.getId()); // 保存时,由于主键自动生成,因此 id 自动被赋值
StudentInfo studentInfo2 = new StudentInfo(); // 新建一个对象,并且按照刚刚插入进去的记录的主键进行赋值,其他属性不同。
studentInfo2.setBirthday( new Date());
studentInfo2.setName( "Gong222");
studentInfo2.setId(1);
updateStudentInfo( studentInfo2);
studentInfo = getStudentInfo( studentInfo.getId());
System. out.println( "id="+ studentInfo.getId()+ ",name="+ studentInfo.getName());
s.close();
System. out.println( "end");
}
结果输出如下:
Hibernate:
insert
into
StudentInfo
(name, birthday)
values
(?, ?)
id=1
Hibernate:
update
StudentInfo
set
name=?,
birthday=?
where
id=?
Hibernate:
select
studentinf0_.id as id0_0_,
studentinf0_.name as name0_0_,
studentinf0_.birthday as birthday0_0_
from
StudentInfo studentinf0_
where
studentinf0_.id=?
id=1,name=Gong222
end
可以看到,当 update 的时候,生成的sql语句直接根据主键来定位。
另一个实验:
public static void main(String[] args) {
Session s = HibernateUtil. getSession();
StudentInfo studentInfo = new StudentInfo();
studentInfo.setBirthday( new Date());
studentInfo.setName( "Gong");
addStudentInfo( studentInfo);
System. out.println( "id="+ studentInfo.getId()); // 保存时,由于主键自动生成,因此 id 自动被赋值
StudentInfo studentInfo2 = new StudentInfo(); // 新建一个对象,并且按照刚刚插入进去的记录的主键进行赋值,其他属性不同。
studentInfo2.setBirthday( new Date());
studentInfo2.setName( "Gong222");
studentInfo2.setId(1);
deleteStudentInfo( studentInfo2); // 删除
studentInfo = getStudentInfo( studentInfo.getId());
System. out.println( studentInfo);
s.close();
System. out.println( "end");
}
运行结果:
Hibernate:
insert
into
StudentInfo
(name, birthday)
values
(?, ?)
id=1
Hibernate:
delete
from
StudentInfo
where
id=?
Hibernate:
select
studentinf0_.id as id0_0_,
studentinf0_.name as name0_0_,
studentinf0_.birthday as birthday0_0_
from
StudentInfo studentinf0_
where
studentinf0_.id=?
null
end
可以看到,主键为 1 的记录已经被删除,查询不到。
因此,辨别一个对象是瞬时状态还是游离状态,关键是看它的主键是否在数据库记录中。如果在,就是游离状态,否则是瞬时状态。其实实际增删改查时,并不需要有瞬时还是游离的概念。
关键是要判断出是不是持久状态,因为持久状态的话,修改对象的值,Hibernate会记下来,在事务提交的时候,所有修改都会同步到数据库中。也就是说,对数据库的修改有延迟,不会每次修改对象,都会同步到数据库中,在事务提交的时候才会。
一般来说,new 出来的与 session 没有关联,是瞬时状态。但是,如果故意地将 new 出来的一个对象按照数据库中的某条记录赋值,那么这个对象也就成为脱管状态,因为已经有数据和它对应了。可以直接用这个对象对数据库进行对应记录的 delete、update 操作。并且,delete 和 update 的时候,只要主键与数据库中的记录相同即可,其他属性不需要相同。
实验:
public static void main(String[] args) {
Session s = HibernateUtil. getSession();
StudentInfo studentInfo = new StudentInfo();
studentInfo.setBirthday( new Date());
studentInfo.setName( "Gong");
addStudentInfo( studentInfo);
System. out.println( "id="+ studentInfo.getId()); // 保存时,由于主键自动生成,因此 id 自动被赋值
StudentInfo studentInfo2 = new StudentInfo(); // 新建一个对象,并且按照刚刚插入进去的记录的主键进行赋值,其他属性不同。
studentInfo2.setBirthday( new Date());
studentInfo2.setName( "Gong222");
studentInfo2.setId(1);
updateStudentInfo( studentInfo2);
studentInfo = getStudentInfo( studentInfo.getId());
System. out.println( "id="+ studentInfo.getId()+ ",name="+ studentInfo.getName());
s.close();
System. out.println( "end");
}
结果输出如下:
Hibernate:
insert
into
StudentInfo
(name, birthday)
values
(?, ?)
id=1
Hibernate:
update
StudentInfo
set
name=?,
birthday=?
where
id=?
Hibernate:
select
studentinf0_.id as id0_0_,
studentinf0_.name as name0_0_,
studentinf0_.birthday as birthday0_0_
from
StudentInfo studentinf0_
where
studentinf0_.id=?
id=1,name=Gong222
end
可以看到,当 update 的时候,生成的sql语句直接根据主键来定位。
另一个实验:
public static void main(String[] args) {
Session s = HibernateUtil. getSession();
StudentInfo studentInfo = new StudentInfo();
studentInfo.setBirthday( new Date());
studentInfo.setName( "Gong");
addStudentInfo( studentInfo);
System. out.println( "id="+ studentInfo.getId()); // 保存时,由于主键自动生成,因此 id 自动被赋值
StudentInfo studentInfo2 = new StudentInfo(); // 新建一个对象,并且按照刚刚插入进去的记录的主键进行赋值,其他属性不同。
studentInfo2.setBirthday( new Date());
studentInfo2.setName( "Gong222");
studentInfo2.setId(1);
deleteStudentInfo( studentInfo2); // 删除
studentInfo = getStudentInfo( studentInfo.getId());
System. out.println( studentInfo);
s.close();
System. out.println( "end");
}
运行结果:
Hibernate:
insert
into
StudentInfo
(name, birthday)
values
(?, ?)
id=1
Hibernate:
delete
from
StudentInfo
where
id=?
Hibernate:
select
studentinf0_.id as id0_0_,
studentinf0_.name as name0_0_,
studentinf0_.birthday as birthday0_0_
from
StudentInfo studentinf0_
where
studentinf0_.id=?
null
end
可以看到,主键为 1 的记录已经被删除,查询不到。
因此,辨别一个对象是瞬时状态还是游离状态,关键是看它的主键是否在数据库记录中。如果在,就是游离状态,否则是瞬时状态。其实实际增删改查时,并不需要有瞬时还是游离的概念。
关键是要判断出是不是持久状态,因为持久状态的话,修改对象的值,Hibernate会记下来,在事务提交的时候,所有修改都会同步到数据库中。也就是说,对数据库的修改有延迟,不会每次修改对象,都会同步到数据库中,在事务提交的时候才会。
相关文章推荐
- 【SSH三大框架】Hibernate基础第三篇:实体对象的三种状态以及get、load、persist三个方法的详解
- hibernate中实体对象的三种状态(生命周期中的三种状态)
- Hibernate 实体对象的三种状态
- hibernate实体对象的三种状态:自由状态,持久状态,游离状态.
- Hibernate实体对象生命周期内的三种状态
- Hibernate入门:CRUD方法及实体对象的三种状态
- 05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法 1
- hibernate实体对象的三种状态:自由状态,持久状态,游离状态.
- Hibernate入门:CRUD方法及实体对象的三种状态
- hibernate实体对象的三种状态:自由状态,持久状态,游离状态.
- 框架学习之Hibernate 第四节 实体对象的三种状态和saveOrUpdate方法
- 05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法 2 关于delete后的状态
- hibernate实体对象的三种状态:自由状态,持久状态,游离状态.
- Hibernate基础使用:CRUD方法及实体对象的三种状态
- hibernate实体对象的三种状态
- hibernate 实体对象的三种状态以及转换关系。
- hibernate 实体对象有三种状态和HQL语句
- hibernate 实体对象的三种状态
- hibernate学习之路(hibernate实体对象的三种状态)
- Hibernate实体对象的生命周期(三种状态详解)