关闭

Hibernate 映射文件属性介绍

686人阅读 评论(0) 收藏 举报
分类:

一开始学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关联映射中才有用。

映射普通属性:

<Class>子元素<property…./>

⑤      <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…/>子元素来完成映射.

映射元素子元素<key…/>可选选项:

⑥        <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作为集合元素的索引。

因此要为集合元素的数据表指定一个索引列—用于保存索。

映射元素子元素:用于映射索引列的元素有如下几个:

<list-index>:用于映射list,数组

<map-key>:用于映射Map集合--基本数据类型的索引列。

<map-key-many-to-many>:用于映射Map集合—实体引用类型的索引列。

<composite-map-key>:用于映射Map集合—复合数据类型的索引列。


Hibernate集合元素数据类型几乎可以是任意数据类型,包括基本类型,字符串,日期,以及其他持久化对象的引用。

但是,1、如果集合元素是基本类型等(不是其他持久化对象的引用),则位于结合中的对象可能根据“值”语义来操作(其生命周期完全依赖于集合持有者,必须通过集合持有者来访问这些元素)

2、如果集合元素是其他持久化对象的引用,此时就变成了关联映射,那么这些集合元素都具有自己的声明周期。

所以:(根据集合存放的元素类型决定)

映射元素子元素配置元素种类:

1、<element../>:当集合元素是基本类型以及包装类,字符串类型和日期类型时使用该元素

2、<composite-element…/>:当集合元素是符合复合类型时使用该元素。

3、<one-to-many../><many-to-many../>当集合元素是其他持久化对象的引用时使用他们。也就是说这两个元素用于进行关联关系的映射。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:44648次
    • 积分:871
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:69篇
    • 译文:2篇
    • 评论:0条