与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();
}
出现异常将事务回滚。会话始终记得关闭,每个线程单独分配会话。
上文中的代码都是伪代码,全部代码请点击这里