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


    一、数据表的映射关系
    在数据库领域中,数据表和数据表之间关系一般可以分为如下几种:
    一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人!
    一对多:比如客户和订单之间的关系,每个客户可以同时下多张订单!
    多对多:比如学生管理系统中,学生与课程,教师与学生之间的关系!
    二、利用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配置文件完成了一对一的映射关系。


    在此便不做具体测试了。
















  • 相关阅读:
    turtle库笔记
    使用turtle库绘制一个红色五角星图形‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪
    postgresql更新sequence的起始值
    es启动报错-系统设置
    mybatis批量update
    postgresql数据库连接数查询
    org.postgresql.util.PSQLException: 栏位索引超过许可范围:1,栏位数:0。
    postgresql创建SEQUENCE
    unzip解压所有zip格式
    jdk8中map的merge方法介绍
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653254.html
Copyright © 2020-2023  润新知