2024年4月8日发(作者:)

(3)mutable="true|false" (4)schema="owner" (5)proxy="ProxyInterface" (6)dynamic-update="tru

e|false" (7)dynamic-insert="true|false" (8)select-before-update="true|false" (9)polymorphism="i

mplicit|explicit" (10)where="arbitrary sql where condition" (11)persister="PersisterClass" (12)

batch-size="N" (13)optimistic-lock="none|version|dirty|all" (14)lazy="true|false" (15)/>

(1)

name: 持久化类(或者接口)的Java全限定名。

(2)

table: 对应的数据库表名。

(3)

discriminator-value(辨别值) (可选 - 默认和类名一样):一个用于区分不同的子类的值,

在多态行为时使用。

(4)

mutable(可变) (可选, 默认值为 true): 表明该类的实例可变(不可变)。

(5)

schema (可选): 覆盖在根元素中指定的schema名字。

(6)

proxy (可选): 指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名

字。

(7)

dynamic-update(动态更新) (可选,默认为false): 指定用于UPDATE 的SQL将会在运行

时动态生成,并且只更新那些改变过的字段。

(8)

dynamic-insert(动态插入) (可选, 默认为false): 指定用于INSERT的 SQL 将会在运行时

动态生成,并且只包含那些非空值字段。

(9)

select-before-update (可选,默认值为false): 指定Hibernate除非确定对象的确被修改了,不

会执行SQL UPDATE操作。在特定场合(实际上,只会发生在一个临时对象关联到一个新

的session中去,执行update()的时候),这说明Hibernate会在UPDATE之前执行一次额外

的SQL SELECT操作,来决定是否应该进行UPDATE。

(10)

polymorphism(多形,多态) (可选, 默认值为 implicit (隐式)): 界定是隐式还是显式的使

用查询多态。

(11)

where (可选) 指定一个附加的SQLWHERE 条件,在抓取这个类的对象时会一直增加这个条

件。

(12)

persister (可选): 指定一个定制的ClassPersister。

(13)

batch-size (可选,默认是1) 指定一个用于根据标识符抓取实例时使用的"batch size"(批次抓取

数量)。

(14)

optimistic-lock(乐观锁定) (可选,默认是version): 决定乐观锁定的策略。

(15)

lazy(延迟) (可选): 假若设置 lazy="true",就是设置这个类自己的名字作proxy接口的一

种等价快捷形式。

若指明的持久化类实际上是一个接口,也可以被完美地接受。其后你可以用来指

定该接口的实际实现类名。你可以持久化任何static(静态的)内部类。记得应该使用标准

的类名格式,就是说比如:Foo$Bar。

不可变类,mutable="false"不可以被应用程序更新或者删除。这可以让Hibernate做一些小小

的性能优化。

可选的proxy属性可以允许延迟加载类的持久化实例。Hibernate开始会返回实现了这个命名

接口的CGLIB代理。当代理的某个方法被实际调用的时候,真实的持久化对象才会被装载。

参见下面的“用于延迟装载的代理”。0

Implicit (隐式)的多态是指,如果查询中给出的是任何超类、该类实现的接口或者该类的名

字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。

Explicit (显式)的多态是指,只有在查询中给出的明确是该类的名字时才会返回这个类的

实例;同时只有当在这个的定义中作为或者出现的子类,

才会可能返回。 大多数情况下,默认的polymorphism="implicit"都是合适的。 显式的多态

在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字

段)。

persister属性可以让你定制这个类使用的持久化策略。你可以指定你自己实现的

Persister的子类,你甚至可以完全从头开始编写一个

ersister接口的实现,可能是用储存过程调用、序列化到文件或

者LDAP数据库来实现的。参阅Persister,这是一个简单的例子(“持

久化”到一个Hashtable)。

请注意dynamic-update和dynamic-insert的设置并不会继承到子类,所以在或者

元素中可能需要再次设置。这些设置是否能够提高效率要视情形而定。请

用你的智慧决定是否使用。

使用select-before-update通常会降低性能.当是在防止数据库不必要的触发update触发器,

这就很有用了。

如果你打开了dynamic-update,你可以选择几种乐观锁定的策略:

version(版本检查) 检查version/timestamp字段

all(全部) 检查全部字段

dirty(脏检查)只检察修改过的字段

none(不检查)不使用乐观锁定

我们非常强烈建议你在Hibernate中使用version/timestamp字段来进行乐观锁定。对性能来

说,这是最好的选择,并且这也是唯一能够处理在session外进行操作的策略(就是说,当

使用()的时候)。 记住version或timestamp属性永远不能使null,不管何种

unsaved-value策略,否则实例会被认为是尚未被持久化的。