配置文件的基本结构如下:
<!DOCTYPE hibernate-mapping PUBLIC
<hibernate-mapping package="包名">
<class name="类名" table="表名">
</id>
</hibernate-mapping>
1. 主键(id)
1)
主键由外部程序负责生成,在
2)
通过hi/lo
3)
与hilo
4)
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。
5)
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。
6)
采用数据库提供的
7)
由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。
8)
由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
9)
与uuid.hex
10) foreign
使用另外一个相关联的对象的标识符作为主键。
主键配置举例如下:
</id>
它的各属性中比较常用的有:name(对应的java类的属性名称)、column(对应的表中的字段)、tyope(属性的类型,eg.java.lang.String)、not-null(设置该属性是否为空,为true时表示非空,默认为false)和length(字段的长度限制)。
Eg3. <property name="description" column="description" type="java.lang.String" />
3. 一对多关系(<many-to-one…/>和<set…></set>)
一对多关系一般是用在一个表与另一个表存在外键关联的时候,例如用户表的组织id与组织表存在外键关联,则“一”方为组织表,“多”方为用户表,因为一个组织可以包含多个用户,而一个用户只能隶属于一个组织。
对于存在一对多关系和多对一关系的双方,需要在…hbm.xml中进行相应配置,这时在“一”方(例如:组织)需要在映射文件中添加元素,因为它包含多个“多”方的对象,一般的格式如下:
<key column="表中对应字段"/>
</set>
<set name="userSet" inverse="true" lazy="true">
<one-to-many class="User"/>
</set>
“多”方(例如:用户)隶属于一个“一”方对象,一般的格式如下:
<many-to-one name="java映射类中对应的属性" column="表中对应字段" class="类名" not-null="true" />
Eg.
<many-to-one name="org" column="orgId" class="Organization" not-null="true" />
“多”方(例如:用户)隶属于一个“一”方对象,一般的格式如下:
映射类中对应的属性" column="表中对应字段" class="类名" not-null="true" />
Eg.
4. 一对一关系()
一对一关系相对一对多关系来说比较少见,但也在某些情况下要用到,例如有一个用户的基本信息表(USER)和一个用户的密码表(PASSWD)就存在一对一的关系。下面来看一下一对一关系在Hibernate的配置。
其中主表(eg.
<one-to-one name="主表对象中子表对象的属性名" class="子表对象的类名"
Eg.
子表(eg.
<one-to-one name="子表对象中主表对象的属性名" class="主表对象的类名" constrained="true" />
Eg.
5. 多对多关系()
在数据库设计时,一般将多对多关系转换为两个一对多(或多对一)关系,例如在基于角色的权限系统中,用户和角色存在的关系就是典型的多对多关系,即一个用户可以具有多个角色,而一个角色又可以为多个用户所有,一般在设计时,都会加一个用户与角色的关联表,该表与用户表以及角色表都存在外键关联。
在本小节中讲述的是没有分解的多对多关系在Hibernate中如何配置。设置格式如下:
<set
<key
<many-to-many
</set>
Eg.
t_user方:
<set
<key
<many-to-many
</set>
t_role方:
<set
<key
<many-to-many
</set>
xx.hbm.xml的type表
Hibernate映射类型 | Java类型 | 标准SQL类型 |
integer | java.lang.Integer | INTEGER |
long | java.lang.Long | BIGINT |
short | java.lang.Short | SMALLINT |
float | java.lang.Float | FLOAT |
double | java.lang.Double | DOUBLE |
big_decimal | java.math.BigDecimal | NUMERIC |
character | java.lang.String | CHAR(1) |
string | java.lang.String | VARCHAR |
byte | byte或java.lang.Byte | TINYINT |
boolean | boolean或java.lang.Boolean | BIT |
Hibernate映射类型 | Java类型 | 标准SQL类型 |
yes_no | boolean或java.lang.Boolean | CHAR(1)('Y'或'N') |
true_false | boolean或java.lang.Boolean | CHAR(1)('Y'或'N') |
date | java.util.Date或java.sql.Date | DATE |
time | java.util.Date或java.sql.Time | TIME |
timestamp | java.util.Date或java.sql.Timestamp | TIMESTAMP |
calendar | java.util.Calendar | TIMESTAMP |
calendar_date | java.util.Calendar | DATE |
binary | byte[] | VARBINARY或BLOB |
text | java.lang.String | CLOB |
serializable | java.io.Serializable实例 | VARBINARY或BLOB |
clob | java.sql.Clob | CLOB |
blob | java.sql.Blob | BLOB |
class | java.lang.Class | VARCHAR |
locale | java.util.Locale | VARCHAR |
timezone | java.util.TimeZone | VARCHAR |
currency | java.util.Currency | VARCHAR |