hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别

两个持久化类为Manager和Department

1:基于主键映射1-1关联关系

1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner

格式为:

<id name="departmentId" type="java.lang.Integer">    <column name="department_id"/>    <!--使用外键的方式来生成当前的主键-->    <generator class="foreign">        <param name="property">manager</param>    </generator>
里面有一个param元素,property属性指定使用当前持久化类的哪一个属性的主键作为外键

2)使用one-to-one元素映射关联属性且必须添加constrained="true"使当前的主键添加外键约束

完整的映射文件代码如下Department.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
    <class name="Department" table="department"  >
        <id name="departmentId" type="java.lang.Integer">
            <column name="department_id"/>
            <!--使用外键的方式来生成当前的主键-->
            <generator class="foreign">
                <!--property属性指定使用当前持久化类的哪一个属性的主键作为外键-->
                <param name="property">manager</param>
            </generator>
        </id>
        <property name="departmentName" type="java.lang.String">
            <column name="department_name"/>
        </property>
        <!--
        采用foreigner主键生成器策略的一端增加one-to-one元素映射关联属性,
        其one-to-one属性还应增加constrained="true",以使当前的主键上添加外键约束
        另一端增加
        -->
        <one-to-one name="manager" class="Manager" constrained="true"></one-to-one>
    </class>
</hibernate-mapping>
Manager.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
    <class name="Manager" table="manager"  >
        <id name="managerId" type="java.lang.Integer">
            <column name="manager_id"/>
            <!--指定主键的生成方式, native:使用数据库本地方式-->
            <generator class="native"/>
        </id>
        <property name="managerName" type="java.lang.String">
            <column name="manager_name"/>
        </property>
        <!--映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射-->
        <one-to-one name="department" class="Department"></one-to-one>
    </class>
</hibernate-mapping>

2:基于外键映射1-1关联关系的不同

1)使用外键的实体类映射文件中使用many-to-one来映射1-1关联关系,且必须指定unique="true"

即一个部门只有一个经理,一个经理只有一个部门,每个部门对应的经理都是不一样的
<many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one>

2)没有外键的实体类使用one-to-one映射1-1关联关系,必须指定property-ref="被关联实体类的引用"来指定使用被关联实体主键以外的字段作为关联字段
<one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
完整的配置文件如下Department.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
    <class name="Department" table="department"  >
        <id name="departmentId" type="java.lang.Integer">
            <column name="department_id"/>
            <!--指定主键的生成方式, native:使用数据库本地方式-->
            <generator class="native"/>
        </id>
        <property name="departmentName" type="java.lang.String">
            <column name="department_name"/>
        </property>
        <!--使用many-to-one的方式来映射1-1关联关系-->
        <many-to-one name="manager" class="Manager" column="manager_id" unique="true"></many-to-one>
    </class>
</hibernate-mapping>

Manager.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate Mapping DTD 3.0"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.cqupt.dayday">
    <class name="Manager" table="manager"  >
        <id name="managerId" type="java.lang.Integer">
            <column name="manager_id"/>
            <!--指定主键的生成方式, native:使用数据库本地方式-->
            <generator class="native"/>
        </id>
        <property name="managerName" type="java.lang.String">
            <column name="manager_name"/>
        </property>
        <!--映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类使用one-to-one进行映射-->
        <!--没有外键的一端要使用one-to-one元素,该元素使用property-ref属性来指定使用被关联实体主键以外的字段作为关联字段-->
        <one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
    </class>
</hibernate-mapping>

 
时间: 2024-10-14 17:10:16

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同的相关文章

数据库设计中一对一、多对一、多对多关系依据外键的实现条件及方法

作者:二歪求知iSk2y链接:https://www.jianshu.com/p/2b27c7ba0653来源:简书 下面以departments和staff_info表为例(为staff_info添加指向departments的外键) 一个表的字段作为外键的条件: 列值必须非空且唯一 测试例子如下: mysql> create table departments (dep_id int(4),dep_name varchar(11)); Query OK, 0 rows affected (0

约束(主键、非空、唯一性、外键、检查约束)

一.五种约束 如果DML操作所涉及数据违反了已定义的约束,则数据库系统将拒绝执行这样的操作. Oracle数据库中,约束具体包括非空(NOT NULL)约束.唯一键(UNIQUE)约束.主键(PRIMARY KEY)约束.外键(FOREIGN KEY)约束和检查(CHECK)约束五种. 和数据表类似,约束也属于数据库对象,可以在建表的同时创建其相关约束,也可以在建表后单独添加:可以由用户命名,也可以由系统按照默认格式自动对约束进行命名:按照约束的定义位置,又可以分为表级约束和字段级约束两种. 建

Hibernate中联合主键生成策略

一.xml配置联合主键 单独设计一个类,作为主键类,如StudentPK A.实现序列化(Serializable接口) B.重写equals()和hashCode() 为什么要从写equals()和hashCode()方法? hashCode相同的会被存储在hash表的同一位置,当找到特定的hashcode之后,会根据equals()方法判断是否是相同的对象,来查找到对应的数据. 小实验1: (1)创建联合主键类StudentPK package com.zgy.hibernate.model

mysql中的外键是什么?以及需要使用外键吗?

外键的作用 外键的主要作用是:保持数据的一致性.完整性. 关于外键,我有自己的一些理解,但是不晓得是否正确,举个例子来表达我的看法:假如现在需要建立一个表,一个什么样的表呢?一个班级的学生个人信息表: 所以在设计的时候,就给表1添加一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表.所以结合2张表就能保持数据的一致性.完整性(估计就是还原成原来的那张大表吧).借着这个例子再谈谈外键的一些事项:1表1可以有一个或者多个外键,也可以没有.(如果表1有多个外键可不可以是这样的情

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessionFactory; static{ //获取配置信息 hibernate.cfg.xml Configuration configuration = new Configuration().configure(); //创建一个 ServiceRegistry的实例 //首先获得其标准建造器,此处用

【SSH之旅】一步步学习Hibernate框架(二):一对一关联映射中的主键关联

一对一的映射在对象模型中是经常见到的,主要是将对象模型转换为关系模型就必须在映射文件中进行配置,重点是<one-to-one>标签的使用,有两种方式,第一是主键关联,第二是唯一外键关联,现在先来看第一种方式. 一对一的关联映射中的主键关联,就是说两个对象具有相同的主键值,以表明它们之间的一一对应的关系,数据库表不会有额外的字段来维护它们之间的关系,仅仅是通过表的主键来关联. 上图的Person类和IdCard类之间是一一对应关系,一个人就只能有一个身份证,一个身份证只能对应一个人,那么身份证的

Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键. 创建User.java: 用户和身份证一对一的关联关系映射       private IdCart idCart; IdCart.java: 身份证和用户,一对一的关系       private User user; 1 package com.bie.bean; 2

Entity Framework Code First主外键关系映射约定

本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个不同表之间可以存在外键依赖关系,一个表自身也可以有自反关系(表中的一个字段引用主键,从而也是外键字段). Entity Framework Code First默认多重关系的一些约定规则: 一对多关系:两个类中分别包含一个引用和一个集合属性,也可以是一个类包含另一个类的引用属性,或一个类包含另一个类

SQLserver中的视图与主外键的创建

一.背景 原来学过数据库的相关内容,只是形式上的,从来也没有实践过,徐徐飘过而已,如今在做机房时,很多知识需要用到视图,才开始去慢慢的实践. 视图:我理解的就是一张表,它把我们所需要的某个表或某几个表中的部分信息提取出来,形成了一张临时的表. 它主要有两个优点:1.简单,它呈现给我们的数据就是我们想要的数据,没有多余的. 2.安全,提供给用户它们权限范围内的数据 我为什么会用到视图?举一个简单的例子,在查询用户信息时,我们可能会用到两张表中的内容.那么这个时候我就需要将两张表中我需要的数据提取出

Hibernate中的&quot;Repeated column in mapping for entity&quot;异常

转:http://lijiejava.iteye.com/blog/786535 一对多双向关联(类Item与类Bid):Item类: Java代码 public class Item { private int id;   private String name;   private Set bids = new HashSet();  ???  } Bid类: Java代码 public class Bid { private int id;   private double amount;