Hibernate各种映射关系总结。
1 多对一
第一步 :建立对象模型
User ----------------------------- id:int name:String group:Group |
Group ------------------------------ id:int name:String
|
第二步:映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="User" table="t_user"> <id name="id" column="id"> <generator class="identity"/> </id> <property name="name" column="User_name" unique="true"/> <many-to-one name="group" column="groupid"/> </class> </hibernate-mapping>
2 一对一映射
2.1 主键映射
1. 建立对象模型
Person[id-int,name-String]
IdCard[id-int,cardNo-int]
2. 映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name" column="Person_name" /> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
2.2 主键映射双向
只需要在IdCard 的XML中添加<one-to-one>标签指向person,就可以告诉Hibernate如何加载person,默认按照主键加载
2.3 外键关联映射
1. 对象模型
Person[id-int,name-String,idcard-IdCard]
IdCard[id-int,cardNo-int]
2 mapping文件
Person.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"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="Person" table="t_person"> <id name="id"> <generator class="identity"> </generator> </id> <property name="name" column="Person_name" /> <many-to-one name="idCard" unique="true"></many-to-one> </class> </hibernate-mapping>
2.4 one-to-one 外键双向mapping
只需要在另一端(IdCard)加入<one-to-one>标签,但是hibernate默认按照主键加载,所以要告诉hibernate按照指定列来加载
示意:
Id-card
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.nintenyun.hibernate">
<class name="IdCard" table="t_idcard">
<id name="id" column="id">
<generator class="identity"/>
</id>
<property name="cardNo" column="cardno" />
<one-to-one name="person" property-ref
="idCard"></one-to-one>
</class>
</hibernate-mapping>
3 一对多映射
1 建立对象模型
Classes[id-int,name-String,student-Set]
Student[id-int,name-String]
2 映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="Class" table="t_class"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <set name="student" > <key column="classid" /> <one-to-many class="Student"/> </set> </class> </hibernate-mapping>
缺点:若将Student的classid设置为非空,将无法保存。应为不是student这一端维护关系,所以student不知道是哪个班级,所以需要发出多余的update语句来更新关系。
(一对多): 先要session.sava(学生),再sessio.save(班级)
(多对一): 先要session.sava(班级),再sessio.save(学生)
改进 采用 一对多双向关联
<set name="student" inverse="true">
这样的好处是 存入数据让多的一端进行维护,不需要发出多余的update.
4 多对多mapping
单向(采用第三方表)
1 对象模型
Role[id-int,name-String]
User[id-int,name-String,role-Set]
2映射文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <set name="role" table="t_user_role"> <key column="userid"></key> <many-to-many class="Role" column="roleid" /> </set> </class> </hibernate-mapping>
双向:
1 对象模型:
Role[id-int,name-String,user-Set]
User[id-int,name-String,role-Set]
2 mapping文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name" /> <set name="user" table="t_user_role"> <key column="userid"></key> <many-to-many class="User" column="userid" /> </set> </class> </hibernate-mapping>
5 继承mapping
第一类继承映射
1 对象模型
Animal
private int id
private String name
private Boolean sex
--------------------------------------------------
public class Bird extends Animal
private int height
--------------------------------------------------
public class Pig extends Animal
private int weight
2 mapping 文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="Animal" table="t_animal" > <id name="id" > <generator class="native"/> </id> <discriminator column="type" type="string"></discriminator> <property name="name"/> <property name="sex"/> <subclass name="Pig" discriminator-value="P"> <property name="weight"/> </subclass> <subclass name="Bird" discriminator-value="B"> <property name="height"/> </subclass> </class> </hibernate-mapping>
第二类mapping
1 对象模型
2 mapping 文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="Animal" table="t_animal" > <id name="id" > <generator class="native"/> </id> <property name="name"/> <property name="sex"/> <joined-subclass name="Pig" table="t_pig"> <key column="pid"/> <property name="weight"/> </joined-subclass> <joined-subclass name="Bird" table="t_bird"> <key column="bid"/> <property name="height"/> </joined-subclass> </class> </hibernate-mapping>
3 第三类mapping
1对象模型
2 mapping 文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="Animal" table="t_animal" > <id name="id" > <generator class="native"/> </id> <property name="name"/> <property name="sex"/> <union-subclass name="Pig" table="t_pig"> <property name="weight"/> </union-subclass> <union-subclass name="Bird" table="t_bird"> <property name="height"/> </union-subclass> </class> </hibernate-mapping>
6 Component 映射
component不是实体,没有OID。
1 对象模型
public class Employee
private int id
private String name
private Contact contact
-------------------------------------
public class Contact
private String email
private String address
private String zipcode
private String contactTel
-------------------------------------
public class User
private int id
private String name
private Contact contact
2 mapping文件
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="User" table="t_user" > <id name="id" > <generator class="native"/> </id> <property name="name"/> <component name="contact"> <property name="email"></property> <property name="address"></property> <property name="zipcode"></property> <property name="contactTel"></property> </component> </class> </hibernate-mapping>
7 复合主键mapping
通常将复合主键相关属性,单独放到一个类中
这个类必须实现 Serializable接口
这个类必须重写hashCode()和equals()方法
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"> <hibernate-mapping package="com.nintenyun.hibernate"> <class name="SC" table="t_sc" > <composite-id name="scpk"> <key-property name="sno"/> <key-property name="cno"/> </composite-id> <property name="sname"></property> <property name="cname"></property> </class> </hibernate-mapping>