Hibernate 实体对象的状态及转化

实体对象的状态及转化:
有了上面关于 Hibernate 缓存的知识,我们再来介绍实体对象的状态就非常容易理解了。
A: 自由态对象:
当我们通过 Java new 关键字来生成一个实体对象时,这时这个实体对象就处于自由状态,如下:
Customer customer=new Customer(“zx”,27,images);
这时 customer 对象就处于自由状态,为什么说 customer 对象处于自由状态呢?这是因为,此时 customer 只是通过 JVM 获得了一块内存空间,还并没有通过 Session 对象的 save() 方法保存进数据库,因此也就还没有纳入 Hibernate 的缓存管理中,也就是说 customer 对象现在还自由的游荡于 Hibernate 缓存管理之外。所以我们可以看出自由对象最大的特点就是,在数据库中不存在一条与它对应的记录。
B: 持久化对象 :
持久化对象就是已经被保存进数据库的实体对象,并且这个实体对象现在还处于 Hibernate 的缓存管理之中。这是对该实体对象的任何修改,都会在清理缓存时同步到数据库中。如下所示:
Customer customer=new Customer(“zx”,27,images);
tx=session.beginTransaction();
session.save(customer);
customer=(Customer)session.load(Customer.class,”1”);
customer.setAge(28);
tx.commit();
这时我们并没有显示调用 session.update() 方法来保存更新,但是对实体对象的修改还是会同步更新到数据库中,因为此时 customer 对象通过 save 方法保存进数据库后,已经是持久化对象了,然后通过 load 方法再次加载它,它仍然是持久化对象,所以它还处于 Hibernate 缓存的管理之中,这时当执行 tx.commit() 方法时, Hibernate 会自动清理缓存,并且自动将持久化对象的属性变化同步到到数据库中。
C: 游离对象:
当一个持久化对象,脱离开 Hibernate 的缓存管理后,它就处于游离状态,游离对象和自由对象的最大区别在于,游离对象在数据库中可能还存在一条与它对应的记录,只是现在这个游离对象脱离了 Hibernate 的缓存管理,而自由对象不会在数据库中出现与它对应的数据记录。如下所示:
Customer customer=new Customer(“zx”,27,images);
tx=session.beginTransaction();
session.save(customer);
customer=(Customer)session.load(Customer.class,”1”);
customer.setAge(28);
tx.commit();
session.close();
session 关闭后, customer 对象就不处于 Hibernate 的缓存管理之中了,但是此时在数据库中还存在一条与 customer 对象对应的数据记录,所以此时 customer 对象处于游离态。
D: 三种对象状态之间的转化:
这三种对象状态,是可以相互转化的,一个自由对象可以通过 session.save() 方法或者 session.saveorupdate() 方法变成持久化对象,一个持久化对象可以通过 session.flush() 或者 session.evict() 方法,移出 Hibernate 缓存从而转化为游离对象,一个游离对象可以通过再次加载或者调用 session.update() 方法,再次恢复为持久化对象,也可以通过调用 session.delete() 方法变成自由对象,并且删除数据库中对应的数据记录。
示例程序:
Configuration cfg = new Configuration();
SessionFactory sf=cfg. configure().buildSessionFactory();
Customer customer=new Customer(“zx”,27,images);// customer 对象处于自由状态
Session session=sf.openSession();
Transaction tx=session.beginTransaction();
session.save(customer);// 保存后 customer 对象处于持久化状态
session.flush();// 清空缓存后 customer 对象处于游离状态
tx.commit();
session.close();
Session session2=sf.openSession();
Transaction tx2=session2.beginTransaction();
session2.update(customer);// 通过调用 update() 方法将游离状态的 customer 对象,再次转化成持久化状态
session2.delete(customer);// 调用 delete() 方法后,当清空缓存时,会将 customer 对象移出缓存,同时会在数据库中生成 delete 事务,来删除 customer 对象对应的数据记录
tx.commit();
session.close();

你可能感兴趣的:(jvm,Hibernate)