hibernate.hbm.xml是hibernate框架的映射关系的文件,使用.hbm.xml为后缀实际没有多大意义,只是一种规范。 例:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2015-10-28 11:14:01 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="org.entity.joined_subclass">
<!--class 映射哪个类到哪个表--> <class name="Person" table="PERSONS" > <id name="id" type="java.lang.Integer"> <column name="PERSON_ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String"> <column name="PERSON_NAME" /> </property> <property name="age" type="java.lang.Integer"> <column name="PERSON_AGE" /> </property> <union-subclass name="Student" table="STUDENTS"> <property name="school" column="SCHOOL" type="string"></property> </union-subclass> </class> </hibernate-mapping>
1.class节点
<class name="Person" table="PERSONS" >
name对应的是哪个类,table对应是数据库的表,dynamic-update:默认为false 设置为true时表示进行更新操作时只更新那些修改了的属性
2.id节点 表的主键
<generator class="native" />主键生成策略
class="native":由hibernate自己判断采用identity,sequence,hilo方式去生成主键,最常用适合全部数据库
class="assigned": java程序必须提供值
class="sequence":使用oracle数据库,利用数据库的自增特性
class="increment":有hibernate生成主键,每次去表里查最后一个主键的值,然后+1
class="identity":利用数据库的自增特性 使用sql server,mysql
class="hilo":由hibernate去帮你生成主键,采用高低算法 (适合全部数据库)
3.property节点:
name:属性名 column:表里的字段名 index:锁引名
unique:是否唯一 update:是否可更新 type:类型 length:字段长度
4.时期,时间的属性和字段映射
类里的属性使用java.util.date类型映射时:
要日期:指定type为date
要时间:指定type为time
要日期和和时间:指定type为timestamp
5.组建映射
一个类,是另一个类的属性,但两个类,是一张表
<component name="address" class="Address">
<property name="province" column="Province" type="string"></property>
<property name="city" column="City" type="string"></property>
<property name="area" column="Area" type="string"></property>
</component>
6.一对多映射
最常见,两个表,对应两个类,表与表之间一对多关系。
例如:一个user可以有多个order
//用户类 public class User { private int customerId; private String customerName; } //订单类 public class Orders { private int orderId; private String orderName; private Customer customer; }
//一对多映射
<many-to-one name="user" class="User">
<!--指定外键列-->
<column name="customer_id" />
</many-to-one>
7. 双向一对多 最常用
代码表示:
//在多的一方
public class Orders { private int orderId; private String orderName; private Customer customer; }
//在一得一方,添加一个含多的一方的集合,可以是set或者list public class Customer { private int customerId; private String customerName; private List<Orders> orders=new ArrayList<Orders>(); }
//在多的一方
<many-to-one name="customer" class="Customer">
<!--指定外键列-->
<column name="customer_id" />
</many-to-one>
//在一的映射文件里,set用set标签,list用bag标签
<!-- 1对多的双向映射 -->
<bag name="orders" table="orders">
//指定外键表的外键列名
<key colum="customer_id" />
//指定list集合里的对象类型
<one-to-many class="Orders"/>
</bag>
//set和bag的常用属性:
//inverse="true":在双向一对多的映射中,集合这端,默认是双向维护关联,这样会引起效率问题, 一般在集合这端,加入此属性,放弃维护,让多的那端主动维护
//cascade="delete"设置允许级联删除 ,常常不用。一般在程序去做判断
//order-by 对集合的结果排序
//order-by="字段名 asc"
8.多对多映射
两个表的多对多关系,通过第3张中间表来实现
在hibernate中,只需写好 多 vs 多的映射关系,会自动帮我们生成中间表
多对多,集合属性的映射:
<!-- 多对多映射集合 -->
<!-- table -> 中间表名字 -->
<bag name="courses" table="STUDENT_COURSE">
<!-- 指定本类,在中间表中的外键名称 -->
<key>
<column name="STU_ID"></column>
</key>
<!-- 本类的集合属性,对应的类,在中间表中,外键的名字 -->
<many-to-many class="Course" column="C_ID"></many-to-many>
</bag>
另外的类,写法真好互补
<bag name="students" table="STUDENT_COURSE">
<key>
<column name="C_ID"></column>
</key>
<many-to-many class="Student" column="STU_ID"></many-to-many>
</bag>