一、单项N
-
1的关系映射(比如最常见的父子关系、比如多个人对应同一个住址)
先看如下两个POJO:
public class Person
... {
private int personid;
private String name;
private int age;
private Address address;
……省略setter&getter
}
每个Person单向地对应一个Address,但无法从Address端来访问Person
public class Address
... {
//该地址的标识属性
private int addressid;
//该地址的详细地址位置
private String addressdetail;
……
}
对于Address端而言,不必关心Person持久化类。
1 .无连接表的N - 1
Person端增加了Address属性,该属性不是一个普通的引用属性,而是引用另一个
持久化类,使用many - to - one元素即可映射N - 1的持久化属性。
type:确定关联实体的类;column:确定外键列的列名。
<? 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 = " prolove " >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 用来映射关联的PO column是Address在该表中的外键列名 -->
< many - to - one name = " address " column = " addressid " />
</ class >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
</ hibernate - mapping >
2 .有连接表的N - 1
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 用来映射关联的PO column是Address在该表中的外键列名 -->
<!-- 使用join元素显式确定连接表 -->
< join table = " join_table " >
< key column = " personid " />
< many - to - one name = " address " />
</ join >
</ class >
</ hibernate - mapping >
二、单向1 - 1的关系映射
1 .基于外键的单向1 - 1
<? 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 = " prolove " >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 增加unique = " true " -->
< many - to - one name = " address " column = " addressid " unique = " true " />
</ class >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
</ hibernate - mapping >
2 .有连接表的单向1 - 1
这种情况很少见,原理同上,增加unique = " true " ;
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
< join table = " join_table " >
< key column = " personid " />
< many - to - one name = " address " unique = " true " />
</ join >
</ class >
</ hibernate - mapping >
3 .基于主键的单向1 - 1
<? 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 = " prolove " >
< class name = " Person " >
< id name = " personid " >
<!-- 基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键 -->
< generator class = " foreign " >
<!-- 关联持久化类的属性名 -->
< param name = " property " > address </ param >
</ generator >
</ id >
< property name = " name " />
< property name = " age " />
<!-- 用于映射1 - 1关联 -->
< one - to - one name = " address " constrained = " true " />
</ class >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
</ hibernate - mapping >
三、单向1 - N的关系映射
N的一端是Address端,在单向关联中无须访问关联类。源代码如下:
public class Address implements Serializable
... {
private int addressid;
private String addressdetail;
private Address() ...{}
……
}
下面是Person端,需要增加集合属性,并且集合属性里每个元素都是持久化类。
public class Person implements Serializable
... {
private int personid;
private String name;
private int age;
//集合属性,用于关联持久化类
prvaite Set addresses = new HashSet();
……
}
1 .无连接表的单向1 - N
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 映射集合属性,关联到持久化类 -->
< set name = " addresss " >
<!-- 确定关联的外键列 -->
< list - index column = " displayorder " />
<!-- 用以映射到关联类属性 -->
< one - to - many class = " Address " />
</ set >
</ class >
</ hibernate - mapping >
2 .有连接表的单向1 - N(类似于N - N)
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 映射集合属性,关联到持久化类 -->
< set name = " addresss " >
<!-- 确定关联的外键列 -->
< set - index column = " displayorder " />
<!-- 用以映射到关联类属性,这里作了修改 -->
< many - to - many class = " Address " unique = " true " />
</ set >
</ class >
</ hibernate - mapping >
四、单向N - N的关系映射( 1 - N)
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
< set name = " addresss " >
<!-- list - index -->
< list - index column = " displayorder " />
<!-- 去除unique -->
< many - to - many class = " Address " />
</ set >
</ class >
</ hibernate - mapping >
先看如下两个POJO:
public class Person
... {
private int personid;
private String name;
private int age;
private Address address;
……省略setter&getter
}
每个Person单向地对应一个Address,但无法从Address端来访问Person
public class Address
... {
//该地址的标识属性
private int addressid;
//该地址的详细地址位置
private String addressdetail;
……
}
对于Address端而言,不必关心Person持久化类。
1 .无连接表的N - 1
Person端增加了Address属性,该属性不是一个普通的引用属性,而是引用另一个
持久化类,使用many - to - one元素即可映射N - 1的持久化属性。
type:确定关联实体的类;column:确定外键列的列名。
<? 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 = " prolove " >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 用来映射关联的PO column是Address在该表中的外键列名 -->
< many - to - one name = " address " column = " addressid " />
</ class >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
</ hibernate - mapping >
2 .有连接表的N - 1
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 用来映射关联的PO column是Address在该表中的外键列名 -->
<!-- 使用join元素显式确定连接表 -->
< join table = " join_table " >
< key column = " personid " />
< many - to - one name = " address " />
</ join >
</ class >
</ hibernate - mapping >
二、单向1 - 1的关系映射
1 .基于外键的单向1 - 1
<? 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 = " prolove " >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 增加unique = " true " -->
< many - to - one name = " address " column = " addressid " unique = " true " />
</ class >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
</ hibernate - mapping >
2 .有连接表的单向1 - 1
这种情况很少见,原理同上,增加unique = " true " ;
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
< join table = " join_table " >
< key column = " personid " />
< many - to - one name = " address " unique = " true " />
</ join >
</ class >
</ hibernate - mapping >
3 .基于主键的单向1 - 1
<? 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 = " prolove " >
< class name = " Person " >
< id name = " personid " >
<!-- 基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键 -->
< generator class = " foreign " >
<!-- 关联持久化类的属性名 -->
< param name = " property " > address </ param >
</ generator >
</ id >
< property name = " name " />
< property name = " age " />
<!-- 用于映射1 - 1关联 -->
< one - to - one name = " address " constrained = " true " />
</ class >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
</ hibernate - mapping >
三、单向1 - N的关系映射
N的一端是Address端,在单向关联中无须访问关联类。源代码如下:
public class Address implements Serializable
... {
private int addressid;
private String addressdetail;
private Address() ...{}
……
}
下面是Person端,需要增加集合属性,并且集合属性里每个元素都是持久化类。
public class Person implements Serializable
... {
private int personid;
private String name;
private int age;
//集合属性,用于关联持久化类
prvaite Set addresses = new HashSet();
……
}
1 .无连接表的单向1 - N
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 映射集合属性,关联到持久化类 -->
< set name = " addresss " >
<!-- 确定关联的外键列 -->
< list - index column = " displayorder " />
<!-- 用以映射到关联类属性 -->
< one - to - many class = " Address " />
</ set >
</ class >
</ hibernate - mapping >
2 .有连接表的单向1 - N(类似于N - N)
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
<!-- 映射集合属性,关联到持久化类 -->
< set name = " addresss " >
<!-- 确定关联的外键列 -->
< set - index column = " displayorder " />
<!-- 用以映射到关联类属性,这里作了修改 -->
< many - to - many class = " Address " unique = " true " />
</ set >
</ class >
</ hibernate - mapping >
四、单向N - N的关系映射( 1 - N)
<? 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 = " prolove " >
< class name = " Address " >
< id name = " addressid " >
< generator class = " identity " />
</ id >
< property name = " addressdetail " />
</ class >
< class name = " Person " >
< id name = " personid " >
< generator class = " identity " />
</ id >
< property name = " name " />
< property name = " age " />
< set name = " addresss " >
<!-- list - index -->
< list - index column = " displayorder " />
<!-- 去除unique -->
< many - to - many class = " Address " />
</ set >
</ class >
</ hibernate - mapping >