一: 一对一的关联。 一对一关联在hibernate中实现的方式有两种:主键关联和外键关联。
主键关联 :重点是关联的两个表共享一个主键值,如学生(student)和 学生证(Card); 相对简单。下面只贴出两个xml中关联的代码
<span style="white-space:pre"> </span> <one-to-one name="login" cascade="all" class="com.lyd.oneone.po.Login" lazy="false" fetch="join" outer-join="true"></one-to-one>
<span style="white-space:pre"> </span><one-to-one name="company" class="com.lyd.oneone.po.Company" constrained="true"></one-to-one>
外键关联 : 两个表各自有不同的主键,但其中一个表有一个外键引用另外一个表的主键。如客户(Client)和地址(Address)。表结构如下:
create table client(
id int primary key,
cname char,
address int
);
create table address(
id int primary key,
city char
);
下面贴出映射的配置文件。
<!--<span style="font-family: Arial, Helvetica, sans-serif;">Client配置:</span><span style="font-family: Arial, Helvetica, sans-serif;">映射与Address的一对一关外键联。唯一的多对一(</span><span style="font-family: Arial, Helvetica, sans-serif;">unique="true"</span><span style="font-family: Arial, Helvetica, sans-serif;">),实际变成一对一关系--></span>
<span style="font-family:Arial, Helvetica, sans-serif;"></span><pre name="code" class="html"> <many-to-one cascade="all" class="com.lyd.oneone.po.Address" column="address" lazy="false" name="address" unique="true"/>
<!--<span style="font-family: Arial, Helvetica, sans-serif;">Address配置:</span><span style="font-family: Arial, Helvetica, sans-serif;">映射</span><span style="font-family: Arial, Helvetica, sans-serif;">Client</span><span style="font-family: Arial, Helvetica, sans-serif;">的一对一外键关联--></span><span style="font-family: Arial, Helvetica, sans-serif;">
</span> <pre name="code" class="html"> <one-to-one class="com.lyd.oneone.po.Client" name="client" property-ref="address"/>
二:一对多
下面以顾客(customer)和订单(orders)为例:
Custome类:
public class Customer implements Serializable {
private Integer id;
private String cname;//客户名称
private String bank;//银行帐号
private String phone;//电话号码
private Set orders = new HashSet();//关联另外一个类
}
Custome配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lyd.onetomany">
<class name="Customer" table="customer">
<id column="ID" name="id" type="integer">
<generator class="identity"/>
</id>
<property column="CNAME" name="cname" type="string"/>
<property column="BANK" name="bank" type="string"/>
<property column="PHONE" name="phone" type="string"/>
<span style="color:#ff0000;"> <strong> <!--一对多双向关联映射customer到orders,单的一方配置-->
<set cascade="all" inverse="true" lazy="false" name="orders">
<key column="CUSTOMER_ID"/>
<one-to-many class="com.lyd.onetomany.Orders"/></strong></span>
<strong> <span style="color:#ff0000;"> </set></span></strong>
</class>
</hibernate-mapping>
orders类
public class Orders implements Serializable {
private Integer id;
private String orderno;//订单号
private Double money;//所需资金
private Customer customer;//关联另外一个PO
}
orders配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lyd.onetomany">
<class name="Orders" table="orders">
<id column="ID" name="id" type="integer">
<generator class="identity"/>
</id>
<property column="ORDERNO" name="orderno" type="string"/>
<property column="MONEY" name="money" type="double"/>
<strong><span style="color:#ff0000;"> <!--一对多双向关联映射的多的一方配置-->
<many-to-one class="com.lyd.onetomany.Customer" column="CUSTOMER_ID" lazy="false" name="customer" /></span></strong>
</class>
</hibernate-mapping>
准备在另外一个博客中写一个学生(Student)课程(Course)成绩(Grade)的 来总结一对多记录自己刚遇到的一个问题。同时会涉及到一个表多次关联。
三:多对多 多对多的关系分析就不说啦,下面以一个案例来记录学生(Student)课程(Course)成绩(Grade),实现学生和课程的关联,为简单去掉一些字段。
如果关联对方没有数据则得到的Set是一个size()=0的Set不是一个空的Set。可用于进行操作前验证关联是否成功。
学生类:Student(不是以学号为主键,这里我就不修改啦)
public class Student implements Serializable {
<span style="white-space:pre"> </span>private int stId;
<span style="white-space:pre"> </span>private String username;
<span style="white-space:pre"> </span>private String sno;
<span style="white-space:pre"> </span>private String password;
<span style="white-space:pre"> </span>private Set classes =new HashSet();
<span style="white-space:pre"> </span>}
课程类:Course
public class Course implements Serializable {
private Integer cs_id;
private String cname;
private Set students =new HashSet();}
成绩类:Grade(在这里只是为了说明表结构)
public class Student_classes implements Serializable {
private Integer grade;
private Integer st_id;
private Integer cs_id;
}
学生的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!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.lyd.hibernate.po.Student" table="student" catalog="stuedu">
<id name="stId" type="java.lang.Integer">
<column name="st_id" />
<generator class="identity" />
</id>
<property name="username" type="string">
<column name="username" length="100" not-null="true" />
</property>
<property name="sno" type="string">
<column name="sno" length="50" not-null="true" />
</property>
<property name="password" type="string">
<column name="password" length="20" />
</property>
<strong><span style="color:#ff0000;"> <!--映射-->
<set name="classes" table="grade" lazy="false" cascade="save-update">
<key column="st_id"></key>
<many-to-many class="com.lyd.hibernate.po.Classes" column="cs_id"></many-to-many>
</set></span></strong>
</class>
</hibernate-mapping>
课程的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!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.lyd.hibernate.po.Classes" table="classes" catalog="stuedu">
<id name="cs_id" >
<column name="cs_id"></column>
</id>
<property name="cname" type="string">
<column name="cName" length="60" />
</property>
<strong><span style="color:#ff0000;"> <!--映射 -->
<set name="students" table="grade" lazy="false" cascade="save-update">
<key column="cs_id"></key>
<many-to-many class="com.lyd.hibernate.po.Student" column="st_id"></many-to-many>
</set></span></strong>
</class>
</hibernate-mapping>