Hibernate 映射文件 结构
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.test.hibernate">
<class name="News" table="news_table">
<id name="id">
<generator class="identity"/>
</id>
<property name="title" not-null="true" type="string"/>
<property name="content" type="string"/>
<!--property name="fullContent"
formula="(select concat(nt.title,nt.content) from news_table nt where nt.id=id)"></property -->
<property name="fullContent"
column="full_content" type="string"
generated="insert"></property>
</class>
</hibernate-mapping>
1. 主要元素配置
hibernate-mapping 有各种属性(P389),class也有各种属性(P390).
class里面也可以配置hibernate-mapping表示覆盖配置.
hibernate-mapping里面可以包含多个class,但是一般一个文件只配置一个class(表).
class里面id配置标识属性,其他使用property配置.
id和property都有各种 属性值可配置(P392)
2. id的生成器配置
<id name="id">
<generator class="identity"/>
</id>
上面主键配置中,generator表示主键生成器(P392).
3. property元素的属性配置(p394)
其中,generated熟悉配置该字段是否由数据库自动生成(通过触发器生成)
配置值为never:不由数据库生成
insert: insert时有数据库生成
always:insert和udpate时都由数据库生成.
配置的类中,在generated配置的值insert时,持久化类中对应的属性值不会插入到数据库中.
在配置的值为always时,持久化类中对应的属性值 不会 被insert/update到数据库.
4. 映射集合属性
Hibernate要求,之久话集合字段必须声明为 接口.
在配置映射文件时,可以使用list,set,map,array等元素(相当于代替普通的property元素),
来配置集合映射.
这些元素可以有下面的属性:
table 指定保存集合属性值的表名,如果没有指定该值,则表名和name相同.
column:指定外键的列名
on-delete指定外键约束是否打开数据库级别的级联删除.
property-ref:指定外键引用的字段是否为原表的主键.
update:指定外键列是否可更新
unique:指定外键列是否具有唯一约束
其他参考(P398)
5. 映射组件
<!-- 组件,表示一个字段是由一个对象表示,这个对象包含几个字段,这些字段都是主表的字段 -->
<component name="fullName" class="FullName" unique="false">
<parent name="owner" />
<property name="first" />
<property name="last" />
<!-- 组件的字段为集合(Map) -->
<map name="power" table="name_power">
<key column="person_id" not-null="true" />
<map-key column="name_aspect" type="string" />
<element column="name_power" type="int" />
</map>
</component>
7. 映射集合,该集合的 元素 为 组件,元素数据来自集合的表,组件字段是集合表中的.
普通map中一个key对应一个字段,而使用组件作为元素,则一个key可以对应多个字段.
<!-- 集合的元素 为 组件 -->
<map name="nicks" table="nick_inf">
<key column="person_id" not-null="true" />
<map-key column="phase" type="string" />
<!-- 集合的元素 为 组件 -->
<!-- 为简化管理,Hibernate不再允许composite-element 里面再包含list,map,set等集合元素 -->
<composite-element class="FullName">
<parent name="owner" />
<property name="first" />
<property name="last" />
</composite-element>
</map>
8. 映射集合,该集合的 key 为 组件, 使用 composite-map-key
组件字段是集合表中的.
<!-- 集合的key为组件, -->
<map name="nickPower" table="nick_power">
<key column="person_id" not-null="true" />
<!-- 因为使用组件作为key,这里必须用这个composite-map-key标签 -->
<composite-map-key class="FullName">
<!-- 映射作为key的组件的 字段 -->
<key-property name="first" type="string" />
<key-property name="last" type="string" />
</composite-map-key>
<element column="nick_power" type="int" />
</map>
9. 组件作为复合主键
此时,组件必须满足:
(1) 实现 java.io.serializable接口
(2) 需要正确重写equals()和hashCode()方法
一个映射配置中,id和composite-id只能出现一次(因为一个表只能有一个主键)
<!-- 组件作为复合主键 -->
<composite-id name="myCompostieKey" class="CompositeKey">
<!-- key1,key2为两个列,在这两个列上生成符合主键,用这两个列构造CompositeKey对象 -->
<key-property name="key1" type="int" />
<key-property name="key2" type="string" />
</composite-id >