hibernate表关联的各种配置:
1、多对多单向:
user----->role
user.hbm.xml:
<hibernate-mapping>
<class name="com.yourdomain.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.yourdomain.Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>
role.hbm.xml:
<hibernate-mapping>
<class name="com.yourdomain.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
2、多对多双向:
user.hbm.xml:
<hibernate-mapping>
<class name="com.yourdomain.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.yourdomain.Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>
role.hbm.xml:
<hibernate-mapping>
<class name="com.yourdomain.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="users" table="t_user_role" order-by="userid">
<!--t_user_role是第三方关联表-->
<key column="roleid"/>
<!--第三方表的作为外键指向本配置对象ID-->
<many-to-many class="com.yourdomain.User" column="userid"/>
<!--userid作为主键指向与之关联的另一对象ID-->
</set>
</class>
</hibernate-mapping>
3、一对多单向:
student(多)----->classes(一)
student.hbm.xml:
<hibernate-mapping>
<class name="com.yourdomain.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
classes.hbm.xml:
<hibernate-mapping package="com.yourdomain">
<class name="Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid"/>//classesid是在student表中加的一字段列名
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
4、一对多双向:
student(多)----->classes(一)
student.hbm.xml:
<hibernate-mapping>
<class name="com.yourdomain.Student" table="t_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="classes" column="classesid"/>
</class>
</hibernate-mapping>
classes.hbm.xml:
<hibernate-mapping package="com.yourdomain">
<class name="Classes" table="t_classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" inverse="true" cascade="all">//inverse表示维护关系反转,true表示失效,不由classes
//这端来维护。cascade表示级联,即当对classes操作时,发现还未有student持久化,会自动持久化student的
<key column="classesid"/>
<one-to-many class="Student"/>
</set>
</class>
</hibernate-mapping>
5、一对一主键关联(单向关联Person---->IdCard)
一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建
Person.java
Person.hbm.xml://其对应的表中只有id,name两个属性
<?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>
<class name="com.bjsxt.hibernate.Person" table="t_person">
<id name="id">
<generator class="foreign">//主键生成方式受制于IdCard主键生成方式
<param name="property">idCard</param>
</generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true"/>
</class>
</hibernate-mapping>
IdCard.java:
IdCard.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">
<hibernate-mapping>
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard">
<id name="id">
<generator class="native"/>
</id>
<property name="cardNo"/>
</class>
</hibernate-mapping>
6、一对一主键关联(双向Person<-------->IdCard)
与一对一主键关联(单向)大体一致,只不过IdCard.hbm.xml的配置里要一个one-to-ont属性,IdCard.java里加一个Person的引用。
IdCard.java:
IdCard.hbm.xml:
7、一对一唯一外键关联(单向Person----->IdCard)
其实是多对对一的一个特例。
Person.java
Person.hbm.xml
IdCard.java
IdCard.hbm.xml
8、一对一唯一外键关联(双向Person<----->IdCard)
相对于上面的一对一唯一外键关联(单向)不同的是,IdCard.java添加了Person的引用与IdCard.hbm.xml添加了one-to-one标签。
IdCard.java:
IdCard.hbm.xml: