瞬时--->持久 想用Session做的第一件事就是把新创建的瞬时对象持久化。用save()方法来做这件事情:
User user = new User();
user.getName().setFirstname("John");
user.getName().setLastname("Doe");
Session session = sessions.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close(); 在session.beginTransaction()和tx.commit()之间发生的任何事情都在一个数据库事务中。我们还没有详细地讨论过事务,我们将在下一章讨论。但是记住一个事务范围内的所有数据库操作或者完全成功或者完全失败。如果一条INSERT 或UPDATE 语句在tx.commit()时失败,在这个事务中对持久对象所做的所有改变将会回滚到数据库级别。然而,Hibernate 不会回滚在内存中对持久对象所做的更改。
分离----->持久。 update()方法通过调度SQL 的UPDATE 语句强制更新数据库中对象的持久状态。user.setPassword("secret");
Session sessionTwo = sessions.openSession();
Transaction tx = sessionTwo.beginTransaction();
sessionTwo.update(user);
user.setUsername("jonny");
tx.commit();
sessionTwo.close(); 对象是否在被传给update()之前或之后修改过了都没有关系。重要的是调用update()方法来重新将分离实例同新的Session(当前事务)关联并且告诉Hibernate把此对象当作脏数据来对待(除非在持久类映射中设置了select-before-update,这种情况下,Hibernate就会通过执行一个SELECT 语句把对象的当前状态同当前数据库的状态相比较来决定对象是否是脏的)。
lock()方法将对象同Session相关联而不强制更新,就像下面这样:
Session sessionTwo = sessions.openSession();
Transaction tx = sessionTwo.beginTransaction();
sessionTwo.lock(user, LockMode.NONE);
user.setPassword("secret");
user.setLoginName("jonny");
tx.commit();
sessionTwo.close(); 在这个例子中,是否在对象同session 相关联之前或之后做了更改很重要。在调用lock()之前做的更改不会同步到数据库中,只有你能够确信分离对象没有做过更改才能使用lock()。在这里我们通过指定LockMode.NONE 告诉Hibernate当重新将对象同Session相关联时不执行版本检查或获得任何数据库级别锁。如果我们指定了LockMode.READ 或LockMode.UPDATE,Hibernate将会执行SELECT 语句来进行版本检查(并且设置更新锁)。
更新持久对象 任何通过get()或其它种类的查询返回的持久对象已经同当前Session和事务上下文相关联了。可以修改对象并把修改后的状态同步到数据库中去。这种机制叫做自动脏数据检查,那意味着Hibernate将会跟踪和保存在一个session中对对象所做的更改。
Session session = sessions.openSession();
Transaction tx = session.beginTransaction();
int userID = 1234;
User user = (User) session.get(User.class, new Long(userID));
user.setPassword("secret");
tx.commit();
session.close();
首先我们需要根据给定的标识符从数据库中检索对象。修改对象,然后当调用tx.commit()时把这些修改同步到数据库中去。当然,一旦我们关闭了Session,这个实例就被认为是分离的
把持久对象转换为瞬时的
将持久对象转为瞬时对象很容易,使用delete()方法将它的持久状态删除:
Session session = sessions.openSession();
Transaction tx = session.beginTransaction();
int userID = 1234;
User user = (User) session.get(User.class, new Long(userID));
session.delete(user);
tx.commit();
session.close();
只有在事务结束Session同数据库同步时才执行SQL的DELETE 语句。Session 关闭以后,user 被认为是普通的瞬时实例。瞬时对象如果不再被其它对象引用将由垃圾回收器销毁。无论是内存中的对象实例还是持久的数据库行都将被移除。
把分离对象转换为瞬时的 分离-->持久-->瞬时
最后,你可以将分离的实例转为瞬时的,从数据库中删除它的持久状态。这意味着不必
重新绑定分离的实例就可以从数据库中删除它,可以直接删除分离的实例:
Session session = sessions.openSession();
Transaction tx = session.beginTransaction();
session.delete(user);
tx.commit();
session.close();
在这个例子中,调用delete()做两件事:将对象同Session 关联然后为删除准备对象,在
tx.commit()时执行
本文围绕Hibernate的Session展开,介绍了如何使用Session将瞬时对象持久化,如用save()方法;还阐述了分离对象转持久的update()、lock()方法,以及更新持久对象的自动脏数据检查机制。此外,说明了将持久和分离对象转为瞬时对象的delete()方法及操作流程。
1041

被折叠的 条评论
为什么被折叠?



