`
Luob.
  • 浏览: 1589945 次
  • 来自: 上海
社区版块
存档分类
最新评论

HIbernate 关系映射配置

阅读更多
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
0
分享到:
评论
2 楼 l万lin 2014-10-31  
写的很详细....好像:IdCard.hbm.xml class属性没改.....
1 楼 Durian 2012-12-18  
头像是本人吗,帅哥

相关推荐

    hibernate关系映射配置.rar

    &lt;hibernate-mapping&gt; &lt;class name="com.bjsxt.hibernate.User" table="t_user"&gt; &lt;!-- --&gt; &lt;/hibernate-mapping&gt; &lt;hibernate-mapping&gt; &lt;class name="com.bjsxt.hibernate.Group" ...

    Hibernate_关联关系映射配置详解

    Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者

    hibernate关系映射

    在提供的压缩包中,包含了不同类型的Hibernate关系映射配置示例代码,如“一对多.rar”、“多对一或双向一对多.rar”和“多对多.rar”。这些示例可以帮助开发者更好地理解和实践各种关系映射的配置方法。通过深入...

    Hibernate_关联关系映射配置

    本教程将详细讲解Hibernate中的关联关系映射配置,帮助你理解和掌握如何在Hibernate中设置不同类型的关联。 一、一对一(One-to-One)关联 在现实世界中,两个实体之间可能存在一对一的关系,例如一个人只有一个...

    Hibernate关系映射

    **标题:“Hibernate关系映射”** 在Java世界中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者将数据库操作转化为面向对象的方式,极大地简化了数据持久化的复杂性。"多对一"关系映射是Hibernate...

    常用 Hibernate 映射配置说明.doc

    ### 常用Hibernate映射配置详解 #### 1. hibernate-mapping节点解析 `hibernate-mapping`节点是Hibernate映射文件中的顶级节点,用于定义一系列配置选项,控制整个映射文件的行为和映射规则。这些配置包括数据库...

    Hibernate映射关系配置:XML方式和注解方式

    标题“Hibernate映射关系配置:XML方式和注解方式”涉及到的是Java持久层框架Hibernate中的一个重要概念——对象关系映射(ORM)。在这个主题中,我们将探讨如何通过XML映射文件和注解来配置Hibernate实体之间的关系...

    Hibernate映射配置实例大全(详细总结)

    "Hibernate映射配置实例大全"是一个全面深入的资源,旨在帮助开发者理解和掌握如何有效地配置Hibernate以实现对象关系映射(ORM)。在这个文档中,我们将探讨各种关键的映射配置方法,以及相关的实例。 首先,我们...

    Hibernate_映射配置文件详解

    Hibernate_映射配置文件详解,个人觉的比较不错的关于hibernate讲解的ppt,对于xml配置,继承关系,多对多等关系映射讲的很详细!

    Hibernate映射配置详解

    在Java世界中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。SSH是Spring、Struts和Hibernate三个开源框架的简称,常被用于构建...

    Hibernate集合映射与关联关系

    在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合...

    Hibernate继承映射代码

    在Java世界中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者用面向对象的方式处理数据库操作。在大型项目中,由于业务需求复杂,我们常常会使用到类的继承来组织代码结构,而Hibernate提供了对...

    Spring+Hibernate 自动映射

    标题中的“Spring+Hibernate 自动映射”是指在Java Web开发中,利用Spring框架与Hibernate ORM工具进行数据层的整合,实现对象关系映射(ORM)的自动化处理。这一技术结合了Spring的强大依赖注入(DI)和事务管理...

    Hibernate关系映射XML生成工具

    Hibernate是一款强大的对象关系映射(ORM)框架,它允许开发者用Java对象来操作数据库,而无需直接编写SQL语句。关系映射XML生成工具,如"Middlegen-Hibernate-r5",则是为了简化这一过程而设计的。这些工具能够自动...

    hibernate的关系映射

    Hibernate提供了一种基于XML或注解的方式来进行关系映射配置。 **二、Hibernate关系映射的类型** 1. **一对一(OneToOne)**: 表示一个实体对应另一个实体的唯一实例。这可以通过在两个类中都定义`@OneToOne`注解...

    hibernate关联映射实例

    在Java企业级开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中...

    Hibernate各种表关系映射配置详解

    本篇文章将深入探讨Hibernate中的一对多、多对多和多对一等表关系映射的配置。 首先,我们来看基本的Hibernate配置文件`hibernate.cfg.xml`。这个文件用于定义数据库连接参数,例如数据库URL、驱动类、用户名和密码...

    hibernate的映射文件配置

    总之,Hibernate映射文件的配置是实现高效、准确的对象关系映射的关键,理解并熟练掌握其配置规则对于使用Hibernate框架进行持久化操作至关重要。通过合理配置主键策略和属性映射,可以显著提高应用程序的数据访问...

Global site tag (gtag.js) - Google Analytics