Hibernate表关系映射之一对一映射

来源:互联网 发布:java 内部类 编辑:程序博客网 时间:2024/05/11 14:30
一、数据表的映射关系
在数据库领域中,数据表和数据表之间关系一般可以分为如下几种:
一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人!
一对多:比如客户和订单之间的关系,每个客户可以同时下多张订单!
多对多:比如学生管理系统中,学生与课程,教师与学生之间的关系!
二、利用Hibernate实现一对一的表关系映射
以就以公司和总经理之间的关系为例。

1、首先建立基本数据模型

建立club和manager两个数据封装类

Club.java

package com.chen;public class Club {private Integer clubID;private String clubName;private Manager manager;public Integer getClubID() {return clubID;}public void setClubID(Integer clubID) {this.clubID = clubID;}public String getClubName() {return clubName;}public void setClubName(String clubName) {this.clubName = clubName;}public Manager getManager() {return manager;}public void setManager(Manager manager) {this.manager = manager;}    }



Manager.java

package com.chen;public class Manager {private Integer managerID;private String managerName;private Club club;public Integer getManagerID() {return managerID;}public void setManagerID(Integer managerID) {this.managerID = managerID;}public String getManagerName() {return managerName;}public void setManagerName(String managerName) {this.managerName = managerName;}public Club getClub() {return club;}public void setClub(Club club) {this.club = club;}}


可以看到两个类中都持有了对方的一个实例,这样才能在数据表中相互感知到对方。


2、配置Hibernate文件

关于hibernate.cfg.xml的配置,这里不做表述,同之前的类似。这里主要讲Hibernate的两个映射文件。

首先Hibernate实现一对一映射有两种方式:外键映射和主键映射,这两种方式的映射文件配置方式是不同的。

首先看外键映射方式:

对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素。为many-to-one元素增加unique=“true” 属性来表示为1-1关联。另一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段。否则则自动关联其主键。



Club.hbm.xml

<?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>    <class name="com.chen.Club" table="CLUBS">        <id name="clubID" type="java.lang.Integer">            <column name="CLUB_ID" />            <generator class="native" />        </id>        <property name="clubName" type="java.lang.String">            <column name="CLUB_NAME" />        </property>        <!-- 使用many-to-one来影射一对一关系 -->        <many-to-one name="manager" class="com.chen.Manager"              column="MGR_ID" unique="true"/>            </class></hibernate-mapping>

Manager.hbm.xml

<?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>    <class name="com.chen.Manager" table="MANAGERS">        <id name="managerID" type="java.lang.Integer">            <column name="MANAGER_ID" />            <generator class="native" />        </id>        <property name="managerName" type="java.lang.String">            <column name="MANAGER_NAME" />        </property>        <one-to-one name="club" class="com.chen.Club" property-ref="manager"></one-to-one>    </class></hibernate-mapping>


采用主键映射的方式

基于主键的映射策略:指一端的主键生成器使用 foreign 策略,表明根据”对方”的主键来生成自己的主键,自己并不能独立生成主键. <param> 子元素指定使用当前持久化类的哪个属性作为 “对方”。

采用foreign主键生成器策略的一端增加 one-to-one 元素映射关联属性,其one-to-one属性还应增加 constrained=“true” 属性;另一端增加one-to-one元素映射关联属性。
constrained(约束):指定为当前持久化类对应的数据库表的主键添加一个外键约束,引用被关联的对象(“对方”)所对应的数据库表主键

Club.hbm.xml

<?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><class name="com.chen.Club" table="CLUBS"><id name="clubID" type="java.lang.Integer"><column name="CLUB_ID" /><!-- 使用外键的方式来生成当前的主键 --><generator class="foreign"><!-- property 属性指定使用当前持久化类的哪一个属性的主键作为外键 --><param name="property">manager</param></generator></id><property name="clubName" type="java.lang.String"><column name="CLUB_NAME" /></property><!-- 采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性, 其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束 --><one-to-one name="manager" class="com.chen.Manager" constrained="true" /></class></hibernate-mapping>

Manager.hbm.xml

<?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>    <class name="com.chen.Manager" table="MANAGERS">        <id name="managerID" type="java.lang.Integer">            <column name="MANAGER_ID" />            <generator class="native" />        </id>        <property name="managerName" type="java.lang.String">            <column name="MANAGER_NAME" />        </property>        <one-to-one name="club" class="com.chen.Club"></one-to-one>    </class></hibernate-mapping>


如此便利用Hibernate配置文件完成了一对一的映射关系。


在此便不做具体测试了。
















0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 眼镜镜片磨花了怎么办 戴眼镜鼻梁有印怎么办 狗狗发烧怎么办最有效 狗狗感冒怎么办最有效 狗狗发烧去医院怎么办 眼睛里长了虫子怎么办 吃了没熟的猪肉怎么办 没熟的鸡肉吃了怎么办 狗狗大便有绦虫怎么办 吃了有虫的猪肉怎么办 米猪肉吃了会怎么办 吃了鱼的寄生虫怎么办 鱼身体里有线虫怎么办 幼猫半夜一直叫怎么办 猫半夜4点叫不停怎么办 眼睛里长了黄斑怎么办 眼睛周围长小疙瘩怎么办 眼睛被手机砸了怎么办 眼睛被东西砸了怎么办 眼睛被打了一下怎么办 眼睛被树枝伤了怎么办 眼球被打了一下怎么办 眼睛黄有血丝是怎么办 上眼皮有异物感怎么办 20岁眼周围皱纹怎么办 才22岁眼睛皱纹怎么办 眼周围发干皱纹怎么办 眼周围淤血肿了怎么办 每到秋季就咳嗽怎么办 左肾泥沙样结石怎么办 双肾泥沙样结石怎么办 温州市民卡丢了怎么办 上眼皮过敏肿了怎么办 上眼皮又痒又肿怎么办 上眼皮红肿痛是怎么办 上眼皮肿的厉害怎么办 眼皮肿了还痒痒怎么办 眼睛被手指戳到怎么办 打球眼睛撞肿了怎么办 打球时眼睛被戳怎么办 狗眼睛被打充血怎么办