实例对象的生命周期

实例对象的生命周期
持久化对象的三种状态
瞬时对象(Transient Objects):使用new初始化的对象不是持久的,如果他们没有和数据库表相关联,一旦应用不再应用这些对象,就会被垃圾回收机制回收。同时也不能序列化

持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例,它由持久化管理器session统一管理,持久实例是在事务中进行操作的。他们的状态在事务结束的时候和数据库同步,当事务提交的时候,通过执行sql的insert,update,delete把内存中的状态同步到数据库中。

离线对象(Detacheed Objects):session关闭以后,持久化对象变成离线对象,离线表示这个对象不再和数据库同步,也不再受Hibernate管理

瞬时对象(Transient Objects):如果没有对象有用它,用完以后就会被垃圾回收,而且在数据库中没有和它对应的记录

离线对象(Detacheed Objects):数据库中有和他对应的记录,但是已经没有任何对象有用它,也可以被垃圾回收。事实上只是session缓存中把它清除了(不再一级缓存里),数据库中仍然存在

当用户把persisten对象执行了Delete操作,这个对象马上就成了瞬时对象(Transient Objects)。因为数据库中已经没有它了,而且也没有对象引用它。所以它可以被垃圾回收
瞬时对象(Transient Objects)和离线对象(Detacheed Objects)的共同点是他们都没有被session管理。
持久化对象(Persistent objects):在数据库中保存了,并且纳入了session的管理(一级缓存)

下面用一段代码说明持久化对象的生命周期
Session级别的缓存是一级缓存。

下面用一段代码说明持久化对象的生命周期
public void testSave1() {
Session session = null;
Transaction tx = null;
User user = null;
try {
session = HibernateUtils.getSession();
//开启事务
tx = session.beginTransaction();

//Transient状态
user = new User();
user.setName("李四");
user.setPassword("123");
user.setCreateTime(new Date());
user.setExpireTime(new Date());

//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
//这里就把上面的数据insert到数据库中了,由于id生辰个策略需要数据库生成,所以数据库为这条记录产生了id,但是此时这条记录是“未提交状态”
session.save(user);
//这里由于还在Session管理中,会发出update语句修改数据库中的数据
user.setName("王五");
//session.update(user);
//到了这一步才会真的发sql,上面的insert和update都是在这里发出的。
tx.commit();
}catch(Exception e) {
e.printStackTrace();
tx.rollback();
}finally {
HibernateUtils.closeSession(session);
}

//数据库中有这条记录,但是对象却不再Session管理中,所以是detached状态
user.setName("张三");
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//persistent状态
session.update(user);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}

从数据库中查询及修改数据中的一些问题
public void testReadByGetMethod1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();

//马上发出查询sql,加载User对象,由于是查询,这里会马上发出sql
User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2a2ff0001");
System.out.println("user.name=" + user.getName());

//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步,不用显示update
//这里会在session的缓存中把数据进行修改,但是还没有发出sql
user.setName("哥");
//这里会为上面的修改发出对应的update语句。
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
Session的脏数据对比:
Session在提交前,会在缓存中维护一个不同版本的数据记录,我们称之为快照,每次对数据的修改都会产生一个新版本的数据快照,最后commint的时候,就根据这些数据快照发出对应的sql。
比如第一不是save:发出insert
后又修改了对象:发出update语句。

采用get查询,如果数据库中没有对应数据,就返回null。

懒加载:注意下面代码的load方法
public void testReadByLoadMethod1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();

//不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载)
//延迟加载:只有真正使用这个对象的时候,才加载(发出sql语句)
//hibernate延迟加载实现原理是代理方式,这里返回的是个代理对象
User user = (User)session.load(User.class, "402880d01b9bf210011b9bf2a2ff0001");
System.out.println("user.name=" + user.getName());

//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
user.setName("发哥");
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
采用load加载数据,如果数据库中没有相应的数据那么抛出ObjectNotFoundException
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值