您的位置:首页 > 其它

Hibernate的持久化对象状态的方法

2016-03-06 18:06 225 查看

1. 持久化实体

为了让瞬态对象转换为持久化状态,HibernateSession提供了如下几个方法。

1) Serialzable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。

2) void persist(Object obj):将obj对象转化为持久化状态,该对象的属性将被保存到数据库。

3) Serializable save(Object obj,Object pk):将obj对象保存到数据库,保存到数据库时,指定主键值。

4) void persist(Object obj,Objectpk):将对象转化为持久化状态,保存到数据库时,指定主键值。

为了将一个处于瞬态的对象变成持久状态,可以看如下的代码:

// 创建消息对象
News n = new News();
// 设置消息标题和消息内容
n.setTitle("my title");
n.setContent("owen,"
+ "网站地址http://www.owen.org");
// 保存消息
sess.save(n);


程序执行save()方法会立即将持久化对象对应的数据插入数据库;而persist()则保证当它在一个事务外部被调用时,并不立即转换成insert语句。这个功能是很有用的,尤其需要封装一个长会话流程的时候,persist()方法就显得尤为重要了。

2. 根据主键加载持久化实体

程序可能通过load()来加载一个持久化实例,这种加载就是根据持久化类的标识属性值加载化实例——其实质就是根据主键从数据库中加载一条记录。

下面是直接加载持久化实体的代码:

News n = session.load(News.class, pk);


上面的代码中的pk就是需要加载的持久化实例标识属性。

当然,除了用load()的方法,我们也可以用get()的方法。load()方法和get()方法的主要区别在于是否延迟加载,使用load()方法将具有延迟加载功能,load()方法不会立即访问数据库,当试图加载的记录不存在时,load()方法可能返回一个未初始化的代理对象;而get()方法总是立即访问数据库,当试试图加载的记录不存在时,get()方法将直接返回null。

3. 更新持久化实体

程序对持久化实例实体所做的修改会在Sessionflush之前被自动保存到数据库,无须程序调用其它方法来将修改持久化。也就是说,修改对象最简单的方法就是Session处于打开状态load()它,然后直接修改即可。如果调用持久化实体的setter方法改变了实验室的属性,Hibernate会在Session flush之前生成一条update语句。

如下代码修改特定行的数据:

News n = session.load(News.class, pk);
n.setTitle(“新标题”);
session.flush();


4. 更新脱管实体

对于一个曾经持久化过、但现在已脱离了Session管理的持久化对象,它被认为处于脱管状态。当程序修改脱管对象的状态后,程序应该是显式地使用Session来保存这些修改。Hibernate提供了update()、merge()和updateOrSave()等方法来保存这些修改。例如下面的代码:

News n = firstSession.load(News.class, pk);
//第一个Session已经关闭了
firstSession,close();
//修改脱管状态下的持久对象
n.setTilte(“新标题”);
//打开第二个session…
Session secondSession = ….
//保存脱管对象所做的修改
secondSession.update(n);


merge()方法也可将程序对脱管对象所做的修改保存到数据库,但merge()与update()方法的最大区别是:merge()方法不会持久化给定的对象。举例来说,当程序执行session.update(a)代码后,a对象将会变成持久化状态;而执行session.merge(a)代码后,a对象依然不是持久化状态,a对象依然不会被关联到Session上,merge()方法会返回a对象的副本——该副本处于持久化对象。

5. 删除持久化实体

还可以通过Session的delete()方法来删除该持久化实例,一旦删除了该持久化,该持久化实例对应的数据记录也将被删除。代码如下:

News n = session.load(News.class, ok);
session.delete(n);

6. Hibernate的“锁模式”

使用load()或get()方法加载持久化对象时,还可指定一个“锁模式“参数。Hibernate使用LockOptions对象代表”锁模式“,LockOptions提供了READ和UPGRADE两个静态属性来代表共享、修改锁。如下代码:

News n = Session.get(News.class, pk, LockOptions.UPGRADE);


Session.LockRequest的lock()方法也将某个脱管对象重新持久化,但该脱管对象也必须是没有修改过的!如下代码:

//简单地重新持久化
session.buildLockRequest(LockOptions.NONE).lock(news);
//先检查持久化对象的版本,然后重新持久化该对象
session.buildLockRequest(LockOptions.READ).lock(person);
//检查持久化对象的版本,然后使用SELECT…FOR UPDATE重新持久化对象
session.buildLockRequest(New LockOptions(LockMode.PESSIMISTIC_WRITE)).lock(teacher);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: