您的位置:首页 > 其它

Hibernate 映射文件属性介绍

2015-11-19 13:05 246 查看
一开始学Hibernate,感觉很简单,就是配个文件操纵数据库。

可是,那只是没有深入学习而已,配置文件的复杂。。。。。。

*1* 映射文件的结构:

一个映射文件可以定义多个持久化类,但是最好是一个持久化类一个而已。

①<hibernate-mapping>
②<class>
③     <id  name="id"  column="person_id">
④           <generator class="identity" />
</id>
⑤      <property name="name" type="string"></property>
⑥        <set name="schools" table="school" >
⑦              <key column="person_id"  not-null="true"/>
.......................................
</set>
</class>
</hibernate-mapping>


①<hibernate-mapping>元素属性有:
Catalog:指定映射的数据库名字
Default-cascade:指定默认级联风格,默认为none
Default-access:指定默认的属性访问策略,默认值为property(即使用setter/getter方法访问)
access=”field”则通过反射访问变量。还可以实现自己的访问策略。
Default-lazy:设置默认的延迟加载策略,默认为true
Package:指定持久化所在的报名
Auto-import:设置是否允许在查询语言中使用非全限定的类名,默认true。

<hibernate-mapping>子元素<class>
②<class>元素属性:
<hibernate-mapping>的属性都有,且class 里配置的属性可以覆盖 hiber-mapping属性
Name:指定要持久化的类名,应写全限定,不指定的话则必须在<hibernate-mapping>指定package属性.
Table:指定持久化类映射的表名。默认以持久化类的类名作为表名。
Discriminator-value:指定区分不同子类的值。???
Mutable:用于指定持久化类的实例是可变还是不可变对象,默认true。
Proxy:指定一个接口,在延迟加载时作为代理使用。
Dynamic-update/insert:指定用于update,insert语句是否在运行时动态生成,默认false,会影响性能
Select-before-update:先查询,true的话update,false的话不执行。通常会降低性能,根据对象是否经常变化设置。
Where:指定一个附加的SQL语句的过滤条件,执行load,get加载持久类对象时要满足where条件的记录才被加载出来。
Batch-size:指定根据标识符来抓去实例时每一批抓去的实例数,默认1
Optimic-lock:指定乐观锁定策略,默认version。 ???
Check:指定一个SQL表达式,用于为该持久化类所对应的表指定一个多行的Check约束

<Class>子元素<id/>:
<id/>: 为持久化类定义的一个标识属性,用于唯一地标识实例,标识属性需要映射到底层数据表的主键。
映射主键:
③<id/>元素属性:

③     <id  name="id"  column="person_id">
④           <generator class="identity" />
</id>


Type:指定标识属性的数据类型(可选)
Column:设置标识属性所映射的数据列的列名。
Unsave-valu:指定某个实例刚刚创建、还未保存呢时的标识属性值。
Access:指定访问策略.
Name:可选。如果不设置,表明该持久化类没有标识属性。
④generator:主键生成器:负责为每个持久化实例生成唯一的逻辑主键值。
种类:
Increment:为long,short或者int 类型主键生成唯一标识。
Identity:提供自增长主键支持的数据表中适用。返回long,short,int类型标识属性。
Sequence;
Hilo:
Seqhilo:
Uuid:用一个128位的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的。
Native:根据底层数据库的能力选择identity,sequence,hilo一个
Assigned:让程序在save()之前为对象分配一个标识符。这相当于不指定<generator>元素时采用的默认策略.
Select:通过数据库触发器选择某个唯一主键的行,并返回其主键值作为标识属性值。
Foreign:表明直接使用另一个关联的对象的标识属性值,这种主键生成器只在基于主键的1-1关联映射中才有用。
映射普通属性:
⑤[b]<Class>子元素<property…./>[/b]

⑤      <property name="name" type="string"></property>


Name:配置时只需要一个name 属性,name属性映射持久类的属性名。
Column:还可以定义 column属性强制指定数据表里存储的列明,列名默认与属性名相同。
Type:指定普通属性的数据类型。
类型可以是:1、Hibernate基本类型名,integer、string,character,date,
2、Java类的全限定类名如int,float,char,java.lang.String
3、可以序列化的java类的类名
4、用户自定义类的类名。
Update,insert:用于设置Hibernate生成的update,insert语句是否需要包含该字段,默认为true。如果该属性无须由hibernate生成,则设置为false。
Formula:这属性指定一个SQL表达式,属性的值根据表达式计算,计算属性没有和它对应的数据列。
Lazy:指定当该实例属性第一个被访问时,是否启动延迟加载,默认为false。
Unique:设置是否为该属性所映射的数据列添加唯一约束。如果为true,就允许该字段作为property-ref 引用的目标。
Not-null:设置是否为该属性所映射的数据列添加not null约束。
Optimistic-lock:设置该属性在进行更新时是否需要使用乐观锁定,默认true。也就是说当该属性的值发生变化时,该持久化对象的版本值将会增长。
Generated:设置该属性映射的数据列的值是否由数据库生成,never(不由数据库生成),insert(insert时生成,但不会在随后的update重新生成),always(insert和update都会重新生成)
Index:指定一个字符串的索引名称,当系统需要hibernate自动建表时,为该属性所映射的数据列创建索引,从而加速基于该数据列的查询。
Unique_key:指定一个唯一键的名称,当系统需要hibernate自动建表时,为该属性所映射的数据列创建索引,只有当该数据列具有唯一约束时才有效。
Length:指定该属性映射的数据列的字段长度。
Precision:指定该属性映射的数据列有效数字位的位数,对数值型的数据列有效。
Scale:指定该属性所映射数据列的小数位数,多double,float,decimal等类型的数据列有效。
Formula属性详解:
1、 formula=”(sql)”英文括号不能少。2、括号里的sql表达式的列名和表名对应于数据库。
3、在formula属性使用参数时,使用wherecur.id(数据库的列名)=currencyID(持久化对象的属性)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

映射集合种类:
两种:1、单纯的集合属性:List,Set,数组等2、Map结构,每个属性值都有对应的key映射
注意点
1、Hibernate 要求持久化集合字段必须声明为接口,实际接口可以是java.util.Set/Collection/
List/Map…等。(待会验证)
原因:因为当程序持久化某个实例时,Hibernate会自动把程序中的集合实现类替换成Hibernate自己的集合实现类(因此不要试图把hibernate集合属性强制转换为集合实现类,如hashset,hashmap,但可以转换为set,map等集合,因为hibernate自己的集合类也实现了map,set等接口。)
2、两个持久化对象不能共享同一个集合元素的引用。

⑥        <set name="schools" table="school" >
⑦              <key column="person_id"  not-null="true"/>
.......................................
//索引列........
//映射集合里面的元素......
</set>


⑥⑤<Class>子元素:集合映射元素:

list:
set:
map:
array:
primitive-array:
bag:用于映射无序集合
idbag: 用于映射无序集合,但为集合增加逻辑次序
---------------------------------------------------------------------------------------
映射集合属性元素包含属性:
Name:用于标注该集合属性的名称。
Table:指定保存集合属性的表名,默认与集合属性同名。
Lazy:是否启动延迟加载,默认true
Inverse:指定该集合关联的实体在双向关联关系中不控制关联关系。
Cascade:指定对持久化对象的持久化操作(sava,update,delete)是否会级联到它所关联的子实体。
Order-by:该属性用于设置数据库对集合元素排序,该属性的值为指定表的指定字段加上asc或desc关键字。(这种排序是数据库进行sql查询时进行的排序,而不是直接在内存中排序)
Sort:指定集合的排序顺序,可以为自然排序,或者使用给定的排序类排序。
Where:指定任意的sql语句中where条件,该条件将在加载或者删除集合元素是起作用,只有满足where条件记录才会被操作。
Batch-size:定义延迟加载时每批抓取集合元素的数量。默认1

因为集合属性都需要保存到另一个数据库表中(集合保存的是同一类型的多条记录,应该保存在某一个表中),所以保存集合属性的数据表必须包含一个外键列,用于参照到主键列。该外键列通过在<set…./><list…/>等中使用<key…/>子元素来完成映射.
⑦[b]映射元素子元素<key…/>可选选项:[/b]

⑥        <set name="schools" table="school" >
⑦              <key column="person_id"  not-null="true"/>
.......................................
</set>


Column:指定外键字段的列名。
On-delete:指定外键约束是否打开数据库级别的级联删除。
Property-ref:指定外键引用的字段是否为原表的主键。
Not-null:
Update:
Unique:
除了无序集<set../><bag…/>外,List,数组用整数作为集合元素的索引值,map使用key作为集合元素的索引。
因此要为集合元素的数据表指定一个索引列—用于保存索。
[b]映射元素子元素:用于映射索引列的元素有如下几个:[/b]
<list-index>:用于映射list,数组
<map-key>:用于映射Map集合--基本数据类型的索引列。
<map-key-many-to-many>:用于映射Map集合—实体引用类型的索引列。
<composite-map-key>:用于映射Map集合—复合数据类型的索引列。

Hibernate集合元素数据类型几乎可以是任意数据类型,包括基本类型,字符串,日期,以及其他持久化对象的引用。
但是,1、如果集合元素是基本类型等(不是其他持久化对象的引用),则位于结合中的对象可能根据“值”语义来操作(其生命周期完全依赖于集合持有者,必须通过集合持有者来访问这些元素)
2、如果集合元素是其他持久化对象的引用,此时就变成了关联映射,那么这些集合元素都具有自己的声明周期。
所以:(根据集合存放的元素类型决定)
[b]映射元素子元素[b]配置元素种类:[/b]

[/b]
1、<element../>:当集合元素是基本类型以及包装类,字符串类型和日期类型时使用该元素
2、<composite-element…/>:当集合元素是符合复合类型时使用该元素。
3、<one-to-many../><many-to-many../>当集合元素是其他持久化对象的引用时使用他们。也就是说这两个元素用于进行关联关系的映射。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: