1.多对一映射
对象模型:
User | Group |
id:int name:String group:Group | id:int name:String |
映射关系:
<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.1、一对一主键关联映射(单向Person-->IdCard)
对象模型:
Person | IdCard |
id:int name:String idCard:IdCard | id:int cardNo:int |
映射关系:
<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>
注意:
<!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard
-->
一对一主键关联映射中,默认了Cascade属性。只有在<one-to-one>标签中才会默认。
一对一是从Person这个角度看的,看到这个人知道它的身份证号。主键关联,Person中的主键是个外键,参照IdCard的主键生成,怎样让生成的主键一样。
2.2一对一主键关联映射:(双向关联Person<---->IdCard)
对象模型:
Person | IdCard |
id:int name:String idCard:IdCard | id:int cardNo:int person:Person |
映射关系:
<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>
<class name="IdCard" table="t_card">
<id name="id">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<property name="cardNo" column="CardNo" />
<one-to-one name="person" constrained="true"/>
</class>
</hibernate-mapping>
2.3 一对一外键关联映射(单向)
对象模型:
Person | IdCard |
id:int name:String idCard:IdCard | id:int cardNo:int |
映射关系:
<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>
注意:此处比普通的多对一关系多了一个unique="true"表示唯一外键关联,也可实现一对一的映射关系。
2.4 一对一外键关联映射(双向)
对象模型:
Person | IdCard |
id:int name:String idCard:IdCard | id:int cardNo:int |
映射关系:
<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>
<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>
注意:
<one-to-one>默认是与主键比较,Property-ref=”idCard”会指定与哪一个字段比较.
加入<one-to-one>标签和数据库没有关系,是告诉Hibernate怎么来做这件事,所以数据库不用重新导出,不像<many-to-one>因为. <many-to-one>要在表里加字段
注:
<one-to-one>标签 含义:指示如何加载关联对象,或者引用对象,默认根据主键加载,
<many-to-one>标签含义:加入外键在多的一端,指向一的一端
3.1.一对多关联(单向)
模型文件:
Classes | Student |
id:int name:String student:Set | id:int name:String |
映射关系:
<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" inverse="false" cascade="all"> <key column="classid" />
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
在该配置文件中,inverse可以使用默认false,或者显示指定false,如以上代码。这样就指定一对多之间的关系由Class这个POJO来维护。在单项一对多关联中,这一点很重要,下面我们通过测试来说明。cascade="all"指定级联的之间的等级,它具有如下几种值:
all : 所有情况下均进行关联操作。
none:所有情况下均不进行关联操作。这是默认值。
save-update:在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete时进行关联操作。
缺点:若将Student的classid设置为非空,将无法保存。因为不是student这一端维护关系,所以student不知道是哪个班级.
改进 采用 一对多双向关联
<set name="student" inverse="true">
这样的好处是 存入数据让多的一端进行维护,不需要发出多余的update.<!-- 分页 -->
3.2.一对多关联(双向)
模型文件:
Classes | Student |
id:int name:String student:Set | id:int name:String |
映射关系:
<id name="id">
<generator class="native"/>
</id>
<property name="name" />
<set name="student" inverse="false" cascade="all"> <key column="classid" />
<one-to-many class="Student"/>
</set>
</class>
4.1多对多映射(单向)
对象模型:
Role User
id:int
name:String
id:int
name:String
role:Set
映射关系:
<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>
这样,hibernate会自动产生中间表t_user_role(userid,roleid) 并且是复合主键,userid为t_user的外键,roleid为t_role的外键
4.2多对多映射(双向)
对象模型:
Role User
id:int
name:String
user:Set
id:int
name:String
role:Set
映射关系:
<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>
<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>
注意:
上面中间表名字是一样的
这样,hibernate也会自动产生中间表t_user_role(userid,roleid) 并且是复合主键,userid为t_user的外键,roleid为t_role的外键
5.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
映射关系:
<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>
5.2第二继承映射
<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>
5.2第三继承映射
<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
对象模型
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
映射关系:
<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()方法
<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>