与Hibernate 交互的可持久化对象(entity)的三种状态,以及状态之间的转换。

与Hibernate 交互的可持久化对象(entity)的三种状态,以及状态之间的转换。

可持久化对象的三个状态

瞬时态/临时态(TRANSIENT)

对象被new 出来,数据库中没有该对象且id为空。 并且没有和 Hibernate session 关联:如下面这个对象就是瞬时态

User user = new User();
user.setName("张三");
user.setAge(18);

通过下列方法可使对象从瞬时态变成持久态

Session session = sessionFactory.openSession();

session.save(Object object);
session.persist(Object object);
session.saveOrUpdate(Object object);
持久态/托管态 (PERSISTENT)

对象被Hibernate session 所持有,通常是数据保存到数据后或从数据库中加载的数据,对该对象(持久态对象)的操作将在事务提交时更新到数据库检测一个对象是不是持久态

Session session = sessionFactory.openSession();
// true 对象是持久态
session.contaions(object);

通过下列方法从数据库中加载 所返回的全是持久态

Session session = sessionFactory.openSession();
session.get(...);
session.load(...);
session.
游离态 (DETACHED)

对象曾经处于持久态,但是现在离开session。虽然对象中包含id。数据库中也有对应的数据,但是已经无法执行和数据相关的操作了,执行延迟加载会报错。游离态瞬时态看起来很相似,它们之间的区别是游离态有id,瞬时态没有。当调用   session.saveOrUpdate(object); 如果对象有id会被当作游离态,执行update 操作。如果对象没有id 将被当作瞬时态 执行insert 操作。

通过下列方法可以把游离态变成持久态
Session session = sessionFactory.openSession();
session.update(object);
session.saveOrUpdate(object);
session.lock(...);
session.replicate(object);
通过下列方法可以将持久态变为游离态
.....
//清除会话,取消 (save(),update(),delete() 等操作),此时会话还未关闭。当前会话中所有持久态将变成游离态
session.clear();
// 将对象从会话中剥离,从而变成游离态
session.evict(Object object);
// 关闭会话 当前会话中所有持久态将变成游离态
session.close();

如果单独使用 hibernate 建议按如下示例编码:

 Session session= sessionFactory.openSession();

 Transaction tx;

 try {

     tx = session.beginTransaction();

     //do some work

     ...

     tx.commit();

 }

 catch (Exception e) {

     if (tx!=null) tx.rollback();

     throw e;

 }

 finally {

     session.close();

 }

 

出现异常将事务回滚。会话始终记得关闭,每个线程单独分配会话。

上文中的代码都是伪代码,全部代码请点击这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值