1. 瞬时对象(Transient Objects):使用new操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。
2.持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例,它由持久化管理器Session统一管理,持久实例是在事务中进行操作的,它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的insert,update和delete语句把内存中的状态同步到数据库中。
3.离线/脱管对象(Detached Objects):Session关闭之后,持久化对象就变成了离线对象,离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。
下面用具体代码说,加深理解:
public void test1(){
Configuration config=new Configuration().configure(); //读取hibernate配置文件
SessionFactory factory=config.buildSessionFactory(); //创建session工厂
Session session=factory.openSession();
Student stu=new Student(); //瞬时对象
try {
session.beginTransaction();
stu.setName("王五");
stu.setPassword("123");
stu.setAge(20);
stu.setAddress("吉林");
stu.setBirthday(new Date());
session.save(stu); //持久化对象
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close(); //离线对象
}
}
一. 瞬时对象:也就是上面的代码,如果我们没有对stu对象进行数据库插入工作(session.save(stu);),那么,当程序执行完毕,stu这个对象就不存在了,我们没有任何办法找到它(会被java 的垃圾回收机制,回收)。
二. 持久化对象:(1). 处于持久化的对象一定会有数据库标识
(2). 它必须与某个hibernate Session对象绑定。
以上两点缺一不可,否则它就不持久化对象。
上述代码中,当我们session.save(stu);之后,stu就变成了持久化对象,因为此时的它被session管理,同时也拥有了数据库标识。
持久化对象的特点:处于持久化状态的对象,如果它的状态发生了变化,hibernate将自动同步到数据库,看如下代码:
public void test2(){
Configuration config=new Configuration().configure(); //读取hibernate配置文件
SessionFactory factory=config.buildSessionFactory(); //创建session工厂
Session session=factory.openSession();
Student stu=new Student(); //瞬时对象
try {
session.beginTransaction();
stu.setName("王五");
stu.setPassword("123");
stu.setAge(20);
stu.setAddress("吉林");
stu.setBirthday(new Date());
session.save(stu); //持久化对象
stu.setName("王五一"); //当持久化对象的状态发生改变时,hibernate会将改变后的状态自动同步到数据库
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close(); //离线对象
}
}
上面代码运行后的结果:
ID |
NAME |
PASSWORD |
AGE |
ADDRESS |
BIRTHDAY |
237511 |
王五一 |
123 |
20 |
吉林 |
17-8月 -11 02.01.27.421000 下午 |
三. 离线对象:持久化对象脱离了hibernate Session的管理,或者,一个对象只数据库标识。
自动同步,当离线对象的状态发生变化时,hibernate不会自动同步到数据库,因为它脱离了hibernate Session,hibernate自然也不会检测到它的状态变化。
如下代码:
public void test3(){
Configuration config=new Configuration().configure(); //读取hibernate配置文件
SessionFactory factory=config.buildSessionFactory(); //创建session工厂
Session session=factory.openSession();
Student stu=new Student(); //瞬时对象
try {
session.beginTransaction();
stu.setName("王五");
stu.setPassword("123");
stu.setAge(20);
stu.setAddress("吉林");
stu.setBirthday(new Date());
session.save(stu); //持久化对象
session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close(); //离线对象
stu.setName("王五一"); //由于此时,stu处离线状态,当它的状态发生变化时,hibernate不会自动同步。
}
}
上面代码运行后的结果:
ID |
NAME |
PASSWORD |
AGE |
ADDRESS |
BIRTHDAY |
237511 |
王五 |
123 |
20 |
吉林 |
17-8月 -11 02.01.27.421000 下午 |
当对象处于离线状态时,我们怎样让它变成持久化状态呢,很简单,如下代码:
public void test4(){
Configuration config=new Configuration().configure();
SessionFactory factory=config.buildSessionFactory();
Session session=null;
Student stu = null;
try {
session=factory.openSession();
stu=(Student)session.get(Student.class, 237511); //通过get方法得到stu对象
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close();
//此时的stu为离线状态
}
try {
session=factory.openSession();
session.beginTransaction(); //开启事务
session.update(stu); //把stu从离线状态,变为持久化状态
stu.setName("王五二");
session.getTransaction().commit(); //提交事务
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.getTransaction().rollback();
}finally{
session.close();
}
}
上面代码运行后的结果:
ID |
NAME |
PASSWORD |
AGE |
ADDRESS |
BIRTHDAY |
237511 |
王五二 |
123 |
20 |
吉林 |
17-8月 -11 02.01.27.421000 下午 |
思考:你可能会发现,stu.setName("王五二"); 在 session.update(stu); 之后,但数据确实是同步到数据库了,这就是我们上面所说的持久化对象的状态发生变化时,hibernate会自动将它同步到数据库。其实这里的update方法并不是发出upate语句,而是将stu从离线状态,变成持久化状态。
分享到:
相关推荐
《精通Hibernate:Java对象持久化详解》是一本深入解析Hibernate技术的专著,它主要针对Java开发者,旨在帮助他们理解和掌握Java对象持久化的精髓。Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了...
在Java应用开发中,对象持久化是一个关键环节,它涉及将程序中的对象状态存储到持久化介质(如关系型数据库)中,并在需要时恢复这些状态。Hibernate作为ORM(对象关系映射)框架,通过提供一种面向对象的方式来处理...
《精通Hibernate:Java对象持久化技术详解》这本书深入剖析了Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者全面理解并熟练掌握Hibernate的使用。Hibernate是Java开发中的重要工具,它简化了...
8. **实体生命周期**:详解Hibernate对对象状态的管理,包括瞬时态、持久态、游离态和脱管态,以及对象状态转换和事件监听器。 9. **多态和继承映射**:讲解如何处理类的继承关系,实现多态查询,包括单表继承、...
精通 Hibernate:Java 对象持久化技术详解 第2版 学习Hibernate必备得一本书
精通 Hibernate_Java 对象持久化技术详解(第2版).pdf
一共有三个分卷。全部下载才能解压。 这本书不错,值得一看。
**hibernate持久化技术详解** Hibernate是一款强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作转化为对Java对象的操作,大大降低了...
本教程“hibernate:java持久化对象详解02”是系列教程的一部分,它将继续深入探讨Java中的持久化对象与Hibernate的使用方法。在开始之前,建议先学习“hibernate:java持久化对象详解01”,以确保对基础概念有清晰的...
精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码精通Hibernate:Java对象持久化技术详解(第2版)源码
精通HibernateJava对象持久化技术详解(第2版)jar文件.zip) annotations-api.jar antlr-2.7.6.jar catalina-ant.jar catalina-ha.jar catalina-tribes.jar catalina.jar commons-collections-3.1.jar commons-...
《精通Hibernate:Java对象持久化技术详解(第2版)》是一本深入解析Java对象持久化框架Hibernate的专业书籍。源码文件涵盖了多个章节,包括chapter1到chapter10,这表明该书通过实例代码详细讲解了Hibernate的核心...
8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 8.3.4 游离对象的特征 8.4 Session接口的详细用法 8.4.1 Session的save()和persist()...
本教程“hibernate:java持久化对象详解01”聚焦于理解Hibernate如何将Java对象持久化到数据库中。 首先,让我们了解一下什么是持久化对象。在Java中,持久化对象是指那些状态可以被保存到持久存储介质(如数据库)...
- **概念**:对象持久化是指将程序中的对象状态保存到外部存储介质的过程,以便在系统重启后仍然可以恢复这些对象的状态。 - **实现方式**:在Java中,常见的对象持久化方式包括使用Java序列化机制、XML文件、数据库...
精通 Hibern一本ate:Java 对象持久化技术详解(第2版)是
《Hibernate持久化技术详解》是孙卫琴老师关于Java领域中ORM(对象关系映射)框架Hibernate的一部经典教程,其“代码1”部分着重于实际操作和实践应用。Hibernate作为一个强大的工具,允许开发者通过面向对象的方式...
**Hibernate 数据持久化详解** Hibernate 是一款开源的Java语言下的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发人员可以使用面向对象的方式处理数据,而无需过多关注底层的SQL语句。本篇文章将...