事务中的持久实例(就是通过session
装载、保存、创建或者查询出的对象)
被应用程序操作所造成的任何修改都会在Session
被刷出(flushed)的时候被持久化(本章后面会详细讨论)。
这里不需要调用某个特定的方法(比如update()
,设计它的目的是不同的)将你的修改持久化。
所以最直接的更新一个对象的方法就是在Session
处于打开状态时load()
它,然后直接修改即可:
DomesticCat cat = (DomesticCat) sess.load( Cat.class, new Long(69) ); cat.setName("PK"); sess.flush(); // changes to cat are automatically detected and persisted
有时这种程序模型效率低下,因为它在同一Session里需要一条SQL SELECT
语句(用于加载对象)
以及一条SQL UPDATE
语句(持久化更新的状态)。
为此Hibernate提供了另一种途径,使用脱管(detached)实例。
请注意Hibernate本身不提供直接执行UPDATE
或DELETE
语句的API。
Hibernate提供的是状态管理(state management)服务,你不必考虑要使用的语句(statements)。
JDBC是出色的执行SQL语句的API,任何时候调用session.connection()
你都可以得到一个JDBC Connection
对象。
此外,在联机事务处理(OLTP)程序中,大量操作(mass operations)与对象/关系映射的观点是相冲突的。
Hibernate的将来版本可能会提供专门的进行大量操作(mass operation)的功能。
参考第 13 章 批量处理(Batch processing),寻找一些可用的批量(batch)操作技巧。