HIbernate 的各种关系配置

标签: hibernate 关系 | 发表时间:2012-11-11 02:10 | 作者:
出处:http://www.iteye.com
1.主键关联one-to-one

释义:两个表使用相同的主键列值

例如:     身份证(IDCard):id , cardno
            中国公民(Person):id , personname

Person.hbm.xml
<?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.sh.entity.Person" table="person" catalog="erp">
		<id name="id" type="java.lang.Integer">
			<column name="ID"/>
			<generator class="native"/>
		</id>
		<property name="personName" type="java.lang.String">
			<column name="PERSON_NAME" length="20"/>
		</property>
		
		<one-to-one name="idCard" class="com.sh.entity.IdCard" cascade="all" outer-join="true"/>
	</class>

</hibernate-mapping>


IdCard.hbm.xml
<?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.sh.entity.Person" table="person" catalog="erp">
		<id name="id" type="java.lang.Integer">
			<column name="ID"/>
			<!-- 设置id_card 的主键是一个外键 -->
			<generator class="foreign">
				<!-- 设置主键的参考列是下面 定义的person -->
				<param name="property">person</param>
			</generator>
		</id>
		<property name="cardNo" type="java.lang.String">
			<column name="CARD_NO" length="25"/>
		</property>
		
		<!-- 限制id_card的主键与person的主键相同 ,在属性上通过 constrained=true (约束条件) -->
		<one-to-one name="person" class="com.sh.entity.Person" constrained="true"/>
	</class>

</hibernate-mapping>



cascade 的描述
属性值 描述
all 所以情况下都进行关联操作
none 所有情况下不进行关联操作
save-update 执行 save-upate 操作是关联
delete 执行delete 关联操作时进行关联


唯一外键关联:many-to-one (unique="true")

释义:是指在两张表的主键值不同时,使用一个新添加的字段来作为外键,以维持 1 对1 关联

例如:     身份证(IDCard):id , cardno, personid(新添加的外键字段)
            中国公民(Person):id , personname

IdCard.hbm.xml
<?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.sh.entity.Person" table="person" catalog="erp">
		<id name="id" type="java.lang.Integer">
			<column name="ID"/>
			<generator class="native"/>
		</id>
		
		<!-- 使用 唯一外键  unique="true" 将  多对1  变成  1 对1  -->
		<many-to-one name="person" class="com.sh.entity.Person" unique="true" fetch="select">
			<column name="PERSON_ID"/>
		</many-to-one>
		
		
		<property name="cardNo" type="java.lang.String">
			<column name="CARD_NO" length="25"/>
		</property>
		
		<!-- 限制id_card的主键与person的主键相同 ,在属性上通过 constrained=true (约束条件) -->
		<one-to-one name="person" class="com.sh.entity.Person" constrained="true"/>
	</class>

</hibernate-mapping>


Person.hbm.xml
<?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.sh.entity.Person" table="person" catalog="erp">
		<id name="id" type="java.lang.Integer">
			<column name="ID"/>
			<generator class="native"/>
		</id>
		<property name="personName" type="java.lang.String">
			<column name="PERSON_NAME" length="20"/>
		</property>
		
<!--注意这里和 主键关联的区别-->
		<one-to-one name="IdCard" class="com.sh.entity.IdCard" property-ref="person"/>
	</class>

</hibernate-mapping>




单向一对多关联

例如: 父亲 和 子女 的关系
      班级 和 学生 的关系

班级:
    classiesd  classesName  teacher createdate  (set)students
学生
    stuid    stuName

Classes.hbm.xml
<?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.sh.entity.Classes" table="classes" catalog="erp">
		<id name="classesid" type="java.lang.Integer">
			<column name="CLASSES_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="classesName" type="java.lang.String">
			<column name="CLASSES_NAME" length="25"/>
		</property>
		
		<property name="teacher" type="java.lang.String">
			<column name="TEACHER" length="25"/>
		</property>
		
		<property name="createDate" type="java.lang.String">
			<column name="CREATE_DATE" length="25"/>
		</property>
		
		<!--  设置一对多的关联   inverse="true" 表示 学生为主控方  添加的时候要先添加 学生 然后添加 班级-->
		<set name="students" inverse="true">
			<key>
				<column name="CLASSES_ID"/>
			</key>
			<one-to-many class="com.sh.entity.Student"/>
		</set>
	</class>

</hibernate-mapping>



Student.hbm.xml
<?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.sh.entity.Studnt" table="student" catalog="erp">
		<id name="stuid" type="java.lang.Integer">
			<column name="ID"/>
			<generator class="native"/>
		</id>
		<property name="stuName" type="java.lang.String">
			<column name="STUNAME" length="25"/>
		</property>
	</class>

</hibernate-mapping>


单向多对一关联
释义:和单向一对多相反, 所处的角度不一样

例如: 父亲 和 子女 的关系
      班级 和 学生 的关系

班级:
    classiesd  classesName  teacher createdate
学生
    stuid    stuName classes

Student.hbm.xml
<?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.sh.entity.Studnt" table="student" catalog="erp">
		<id name="stuid" type="java.lang.Integer">
			<column name="ID"/>
			<generator class="native"/>
		</id>
		<!-- 设置单向 多对一关联 -->
		<many-to-one name="classes" class="com.sh.Classes" fetch="select">
			<column name="CLASSES_ID"/>
		</many-to-one>
		
		<property name="stuName" type="java.lang.String">
			<column name="STUNAME" length="25"/>
		</property>
	</class>

</hibernate-mapping>



Classes.hbm.xml
<?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.sh.entity.Classes" table="classes" catalog="erp">
		<id name="classesid" type="java.lang.Integer">
			<column name="CLASSES_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="classesName" type="java.lang.String">
			<column name="CLASSES_NAME" length="25"/>
		</property>
		
		<property name="teacher" type="java.lang.String">
			<column name="TEACHER" length="25"/>
		</property>
		
		<property name="createDate" type="java.lang.String">
			<column name="CREATE_DATE" length="25"/>
		</property>
		
	</class>

</hibernate-mapping>


注意: 单向 多对一 和单向 一对多 关联  在添加的时候 是有顺序的  根据 关系配置的时候 谁是主空方 就的先添加 主控方
有一个 insert  和upate 语句 

双向一对多关联
释义:由于 单向 会出现 添加的时候 有顺序 ,否则会有错误  就出现 双向了

班级:
    classiesd  classesName  teacher createdate    (set) students
学生
    stuid    stuName classes

Classes.hbm.xml
<?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.sh.entity.Classes" table="classes" catalog="erp">
		<id name="classesid" type="java.lang.Integer">
			<column name="CLASSES_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="classesName" type="java.lang.String">
			<column name="CLASSES_NAME" length="25"/>
		</property>
		
		<property name="teacher" type="java.lang.String">
			<column name="TEACHER" length="25"/>
		</property>
		
		<property name="createDate" type="java.lang.String">
			<column name="CREATE_DATE" length="25"/>
		</property>
		
		<set name="students" inverse="true" cascade="all">
			<key>
				<column name="CLASSES_ID"/>
			</key>
			<one-to-many class="com.sh.entity.Student"/>
		</set>
	</class>

</hibernate-mapping>



Student.hbm.xml

<?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.sh.entity.Studnt" table="student" catalog="erp">
		<id name="stuid" type="java.lang.Integer">
			<column name="ID"/>
			<generator class="native"/>
		</id>
		<!-- 设置单向 多对一关联 -->
		<many-to-one name="classes" class="com.sh.Classes" fetch="select">
			<column name="CLASSES_ID"/>
		</many-to-one>
		
		<property name="stuName" type="java.lang.String">
			<column name="STUNAME" length="25"/>
		</property>
	</class>

</hibernate-mapping>



注意 :双向 表示  你中有我 ,我中有你, 一般采用 双向 关系 替代 单向关系
为了性能考虑 一般主空方 都设在多的那边 (就像一个老师记住那么多学生难,而 一个学生记住下老师 就简单了)

多对多关联
释义:第一个表中的一行可以与第二个表中的一行或多行相关,
     第二个表中的一行 也可以于第一个表中的一行 或者 多行相关
为了建立多对多关联 需要建立一个中间表来表示 相互之间的关系.
在应用系统中,有很多领域都设计到多对多关联.比如 权限管理中的用户和角色 ,角色和 功能之间的关系 ,但是在使用中 多对多的管理性能不佳,建议在使用中 尽量避免 大量使用

单向多对多关联
释义:单向多对多关联 在实际应用中使用频率较低,一般不用

例如:
   用户和地址的关系
   一般只需要在 用户类中 添加  地址的集合关系

Employee.hbm.xml
<?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.sh.entity.Employee" table="employee" catalog="erp">
		<id name="empId" type="java.lang.Integer">
			<column name="EMP_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="empName" type="java.lang.String">
			<column name="EMP_NAME" length="25"/>
		</property>
		
		<set name="addresses">
			<!-- KEY:和当前 类的关联字段 -->
			<key>
				<column name="EMP_ID" not-null="true"/>
			</key>
			<many-to-many class="com.sh.entity.Address"/>
		</set>
	</class>

</hibernate-mapping>



Address.hbm.xml
<?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.sh.entity.Address" table="address" catalog="erp">
		<id name="addId" type="java.lang.Integer">
			<column name="ADD_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="addName" type="java.lang.String">
			<column name="ADD_NAME" length="25"/>
		</property>
		
	</class>

</hibernate-mapping>



双向多对多关联
释义:双向多对多关联 需要在两端都使用集合属性

例如:
  员工: empid   empName
  地址: addid   addname
(中间表)用户地址: empid  addid

Employee.hbm.xml
<?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.sh.entity.Employee" table="employee" catalog="erp">
		<id name="empId" type="java.lang.Integer">
			<column name="EMP_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="empName" type="java.lang.String">
			<column name="EMP_NAME" length="25"/>
		</property>
		
		<set name="addresses" table="emp_addess" cascade="save-update">
			<!-- KEY:和当前 类的关联字段 -->
			<key>
				<column name="EMP_ID" not-null="true"/>
			</key>
			<many-to-many class="com.sh.entity.Address" column="ADD_ID"/>
		</set>
	</class>

</hibernate-mapping>



Address.hbm.xml
<?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.sh.entity.Address" table="address" catalog="erp">
		<id name="addId" type="java.lang.Integer">
			<column name="ADD_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="addName" type="java.lang.String">
			<column name="ADD_NAME" length="25"/>
		</property>
		
		<!-- 双向的 两个 类  都需 通过  集合属性 -->
		<set name="emps" table="emp_address" cascade="save-update">
			<key>
				<column name="ADD_ID"/>
			</key>
			<many-to-many class="com.sh.entity.Employee" column="EMP_ID"/>
		</set>
		
	</class>

</hibernate-mapping>





分解双向多对多关联
释义:将双向多对多关联分成两个一对多关系关联

例如:
   员工: empid   empName
  地址: addid   addname
(中间表)用户地址: id  empid  addid (注意 添加了一个id)

Employee.hbm.xml
<?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.sh.entity.Employee" table="employee" catalog="erp">
		<id name="empId" type="java.lang.Integer">
			<column name="EMP_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="empName" type="java.lang.String">
			<column name="EMP_NAME" length="25"/>
		</property>
		
                <!-- 都是主控方 --->
		<set name="addresses" table="emp_addess" inverse="true" cascade="save-update">
			<!-- KEY:和当前 类的关联字段 -->
			<key>
				<column name="EMP_ID" not-null="true"/>
			</key>
			<!-- 注意 这里采用的是  一对多 -->
			<one-to-many class="com.sh.entity.Address"/>
		</set>
	</class>

</hibernate-mapping>



Addres.hbm.xml
<?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.sh.entity.Address" table="address" catalog="erp">
		<id name="addId" type="java.lang.Integer">
			<column name="ADD_ID"/>
			<generator class="native"/>
		</id>
	
		<property name="addName" type="java.lang.String">
			<column name="ADD_NAME" length="25"/>
		</property>
		
		<!-- 双向的 两个 类  都需 通过  集合属性 都是主控方 -->
		<set name="emps" table="emp_address" inverse="true" cascade="all">
			<key>
				<column name="ADD_ID"/>
			</key>
			<!-- 注意这里 采用的   一对多 的关系 -->
			<one-to-many class="com.sh.entity.Employee"/>
		</set>
		
	</class>

</hibernate-mapping>




用户 地址关系表
EmpAddress.hbm.xml
<?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.sh.entity.EmpAddress" table="emp_address" catalog="erp">
		<id name="eaId" type="java.lang.Integer">
			<column name="EA_ID"/>
			<generator class="native"/>
		</id>
	
		<many-to-one name="employee" class="com.sh.entity.Employee" fetch="select">
			<column name="EMP_ID"/>
		</many-to-one>
		
		<many-to-one name="address" class="com.sh.entity.Address" fetch="select">
			<column name="ADD_ID"/>
		</many-to-one>
		
	</class>

</hibernate-mapping>


权限管理的设计

功能表 :functions_id, function_name ,iden_Name
角色表 :role_id, role_Name ,description
用户表 :userid, userName,Password,inactive,
角色-功能表  : role_functions_id, role_id,functions_id
角色-用户表: role_user_id ,role_id ,user_id


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hibernate 关系] 推荐:

HIbernate 的各种关系配置

- - ITeye博客
1.主键关联one-to-one. 释义:两个表使用相同的主键列值. 例如:     身份证(IDCard):id , cardno.             中国公民(Person):id , personname. . .

Hibernate面试题

- - ITeye博客
什么是Hibernate的并发机制. Hibernate并发机制:. a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,. 如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用.

Hibernate Lazy属性

- - 博客园_首页
  Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术. 这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录. 通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销. Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势.

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.

hibernate优化

- - 开源软件 - ITeye博客
原文 http://developer.51cto.com/art/200906/129539.htm. 文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.

JPA & Hibernate 注解

- - CSDN博客编程语言推荐文章
必须,name为可选,对应数据库中一的个表 . 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息 . name:可选,表示表的名称.默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名 . catalog:可选,表示Catalog名称,默认为Catalog(""). .

hibernate 大对象类型的hibernate映射

- - CSDN博客推荐文章
在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字节数组 byte[] 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应.

JBoss发布Hibernate 4.0

- - InfoQ cn
近日, JBoss发布了流行的对象/关系(O/R)映射框架 Hibernate. Hibernate 4主要的新特性如下所示:. 引入了“Services”API. 提供了更棒的日志,支持 i18n与消息编码(通过JBoss Logging而非 slf4j). 为 OSGi支持做好了准备.

快速上手Hibernate

- - CSDN博客推荐文章
在前面我们已经对Hibernate有所了解,并知道了使用Hibernate的好处,下面就给大家展示一下如何快速使用Hibernate:. 1.下载Hibernate,并解压缩(下载地址: http://www.hibernate.org/downloads). 2.创建一个新的Java项目.   加入数据库驱动(以mysql示例).

Hibernate 二级缓存

- - CSDN博客推荐文章
很多人对二级缓存都不太了解,或者是有错误的认识,我一直想写一篇文章介绍一下hibernate的二级缓存的,今天终于忍不住了. 我的经验主要来自hibernate2.1版本,基本原理和3.0、3.1是一样的,请原谅我的顽固不化. hibernate的session提供了一级缓存,每个session,对同一个id进行两次load,不会发送两条sql给数据库,但是session关闭的时候,一级缓存就失效了.