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;} }
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配置文件完成了一对一的映射关系。
在此便不做具体测试了。
- Hibernate表关系映射之一对一映射
- hibernate映射关系一对一映射
- Hibernate关系映射之一对一关系
- Hibernate关系映射一对一
- hibernate 映射关系 一对一
- hibernate关系映射 一对一
- Hibernate一对一关系映射
- Hibernate一对一关系映射
- hibernate一对一映射关系
- Hibernate关系映射一对一
- Hibernate关联关系映射之一对一
- Hibernate入门之关系篇:一对一映射
- Hibernate进阶之双向一对一关系映射
- hibernate映射之一对一映射
- Hibernate之一对一映射
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- Hibernate对象关系映射---一对一
- Hibernate对象关系映射---一对一
- Caffe源码中Pooling Layer文件分析
- Design Pattern(2)-Strategy Pattern
- mybatis中的#和$的区别
- item图片 打开新的activity
- 使用Faster-Rcnn进行目标检测
- Hibernate表关系映射之一对一映射
- 个人作业1——四则运算题目生成
- swift开发中的一些小方法
- 正则详解及实战(JavaScript)
- Mysql 数据库(九)配置utf8编码集
- android系统UID定义
- 3-9遇到的一些概念 以及CNN相关概念2
- eclipse内存分配
- swift 面向协议学习思考