一、数据模型

1.学生信息模型(编号、名称、身份信息)

  1. public class Student implements java.io.Serializable{
  2.  
  3. private static final long serialVersionUID = 1L;
  4.  
  5. private Integer sid;
  6.  
  7. private String sname;
  8.  
  9. private IdClass pid;
  10.  
  11. public Integer getSid() {
  12. return sid;
  13. }
  14.  
  15. public void setSid(Integer sid) {
  16. this.sid = sid;
  17. }
  18.  
  19. public String getSname() {
  20. return sname;
  21. }
  22.  
  23. public void setSname(String sname) {
  24. this.sname = sname;
  25. }
  26.  
  27. public IdClass getPid() {
  28. return pid;
  29. }
  30.  
  31. public void setPid(IdClass pid) {
  32. this.pid = pid;
  33. }
  34. }

2.身份信息模型(身份ID、省份)

  1. public class IdClass implements java.io.Serializable{
  2.  
  3. private static final long serialVersionUID = 1L;
  4.  
  5. private String pid;
  6.  
  7. private String provience;
  8.  
  9. private Student stu;
  10.  
  11. public String getPid() {
  12. return pid;
  13. }
  14.  
  15. public void setPid(String pid) {
  16. this.pid = pid;
  17. }
  18.  
  19. public String getProvience() {
  20. return provience;
  21. }
  22.  
  23. public void setProvience(String provience) {
  24. this.provience = provience;
  25. }
  26.  
  27. public Student getStu() {
  28. return stu;
  29. }
  30.  
  31. public void setStu(Student stu) {
  32. this.stu = stu;
  33. }
  34. }

二、单向唯一关联

A.配置文件描述

  1. <hibernate-mapping package="com.hibernate.orm">
  2. <class name="Student" table="student">
  3. <id name="sid" type="java.lang.Integer" length="50">
  4. <generator class="identity"/>
  5. </id>
  6. <property name="sname" column="s_name" not-null="false" type="java.lang.String"/>
  7.  
  8. <!-- 主控方:这里虽然使用了many2one,但是设置了unique为true,这样就只能是单向一对一关联了 -->
  9. <many-to-one name="pid" column="pid" cascade="all" unique="true"/>
  10. </class>
  11. </hibernate-mapping>
  1. <hibernate-mapping package="com.hibernate.orm">
  2. <class name="IdClass" table="id_class_info">
  3. <id name="pid" type="java.lang.String" length="20">
  4. <generator class="assigned"/>
  5. </id>
  6. <property name="provience" column="provience" not-null="false" type="java.lang.String"/>
  7.  
  8. <!-- 被控方:指定stu属性被IdClass中的pid属性控制 -->
  9. <one-to-one name="stu" property-ref="pid"/>
  10.  
  11. </class>
  12. </hibernate-mapping>

B.注解描述(在相关的属性上添加注解描述)

  1. @Entity
  2. @Table(name="student",catalog="study")
  3. public class Student implements java.io.Serializable{
  4.  
  5. private static final long serialVersionUID = 1L;
  6.  
  7. @Id
  8. @GeneratedValue(strategy=GenerationType.IDENTITY)
  9. private Integer sid;
  10.  
  11. @Column(name="s_name",nullable=false, length=11)
  12. private String sname;
  13.  
  14. @OneToOne(cascade=CascadeType.ALL)
  15. @JoinColumn(name="pid", nullable=false, unique=true)
  16. private IdClass pid;
  17.  
  18. //......getter和setter方法省略............
  19. }
  1. @Entity
  2. @Table(name="id_class_info",catalog="study")
  3. public class IdClass implements java.io.Serializable{
  4.  
  5. private static final long serialVersionUID = 1L;
  6.  
  7. @Id
  8. @GeneratedValue(generator="pid")
  9. @GenericGenerator(name="pid",strategy="assigned")
  10. private String pid;
  11.  
  12. @Column(name="provience", length=40, nullable=false)
  13. private String provience;
  14.  
  15. //只要是双向关联就一定要指定mappedBy,将控制权交给指定的一方
  16. @OneToOne(mappedBy="pid")
  17. private Student stu;
  18.  
  19. //......getter和setter方法省略............
  20. }

注:一对一关联配置参见网友博客:http://blog.csdn.net/dreamcatchergo/article/details/13627709

三、双向一对一外键关联

                 单向的基础上,添加另一方为被控方,通过one-to-one实现被控方描述

A.配置文件描述

  1. <!-- 被控方:指定stu属性被IdClass中的pid属性控制 -->
  2. <one-to-one name="stu" property-ref="pid"/>

B.注解描述

  1. //只要是双向关联就一定要指定mappedBy,将控制权交给指定的一方
  2. @OneToOne(mappedBy="pid")
  3. private Student stu;

四、联合主键

                添加主键类,在身份信息模型中添加血型,将身份ID和血型作为联合主键,代码如下

  1. public class IdCardPK implements Serializable{
  2.  
  3. private static final long serialVersionUID = 1L;
  4.  
  5. private String pid;
  6.  
  7. private String bloodType; //血型
  8.  
  9. //*******************
  10.  
  11. }

A.配置文件描述

  1. <hibernate-mapping package="com.hibernate.orm.ufk">
  2. <class name="IdClass" table="id_class_info">
  3. <!-- 联合主键 -->
  4. <composite-id name="idCardPK" class="com.hibernate.orm.ufk.IdCardPK">
  5. <key-property name="pid" column="p_id" length="20" type="string"/>
  6. <key-property name="bloodType" column="blood_type" length="10" type="string"/>
  7.  
  8. <!-- 不能再指定 generator
  9. <generator class="assigned"/>
  10. -->
  11. </composite-id>
  12.  
  13. <property name="provience" column="provience" not-null="false" type="string"/>
  14. </class>
  15. </hibernate-mapping>

student方修改关联配置,将原有的pid做如下修改:

  1. <many-to-one name="pid" cascade="all">
  2. <column name="p_id" unique="true"/>
  3. <column name="blood_type"/>
  4. </many-to-one>

B.注解描述

主键类配置如下,注意添加getter和setter方法:

  1. @Embeddable
  2. public class IdCardPK implements Serializable{
  3.  
  4. private static final long serialVersionUID = 1L;
  5.  
  6. @Column(name="p_id",nullable=false, length=20)
  7. private String pid;
  8.  
  9. @Column(name="blood_type",nullable=false)
  10. private String bloodType; //血型
  11.  
  12. }

身份信息修改如下

  1. @EmbeddedId
  2. private IdCardPK idCardPK;

学生信息模型关联身份信息配置:

  1. @OneToOne(cascade=CascadeType.ALL)
  2. @JoinColumns({
  3. @JoinColumn(name="p_id",referencedColumnName="p_id"),
  4. @JoinColumn(name="blood_type",referencedColumnName="blood_type")
  5. })
  6. private IdClass pid;

五、组件关联(将POJO类中的属性作为添加到某实体类)

              定义一个组件类POJO,代码如下:

  1. public class IdClass{
  2.  
  3. private String provience;
  4.  
  5. private String bloodType;
  6.  
  7. public String getProvience() {
  8. return provience;
  9. }
  10.  
  11. public void setProvience(String provience) {
  12. this.provience = provience;
  13. }
  14.  
  15. public String getBloodType() {
  16. return bloodType;
  17. }
  18.  
  19. public void setBloodType(String bloodType) {
  20. this.bloodType = bloodType;
  21. }
  22. }

A.配置文件描述

                      将POJO中的属性作为student的属性,配置如下:

  1. <hibernate-mapping package="com.hibernate.orm.component">
  2. <class name="Student" table="student">
  3. <id name="sid" type="integer" length="50">
  4. <generator class="identity"/>
  5. </id>
  6. <property name="sname" column="s_name" not-null="false" type="string"/>
  7.  
  8. <!-- 组件关联配置 -->
  9. <component name="pid" class="IdClass">
  10. <property name="provience" column="provience" length="20"/>
  11. <property name="bloodType" column="blood_type" length="10"></property>
  12. </component>
  13. </class>
  14. </hibernate-mapping>

B.注解描述,通过Embedded关联组件

  1. //和组件关联
  2. @Embedded
  3. private IdClass pid;

【Hibernate】--一对一关联、联合主键的更多相关文章

  1. Hibernate注解映射联合主键的三种主要方式

    今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException ...

  2. Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法

    联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为 ...

  3. Jpa/Hibernate ManyToOne 关联非主键列 延迟加载失效

    @ManyToOne配置延迟加载,如果是关联主键列, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "billid", ...

  4. Hibernate 一对一映射(共享主键)

  5. Hibernate联合主键映射

    1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...

  6. hibernate 联合主键生成机制(组合主键XML配置方式)

    hibernate 联合主键生成机制(组合主键XML配置方式)   如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...

  7. 04.Hibernate一对一关联

        前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系     本文根据客户信息表(tb_customer)和地址信 ...

  8. Nhibernate 一对一关系映射(主键映射)

    参考:点击这里 妈的,搞了一天了,终于可以了,现在总结下,以防下次再出现这样痛苦的问题了,有两个表:user(用户)和Blog(设置表),它们之间的关系正如我所说的是一对一的关系.现在我们来映射这两个 ...

  9. HIBERNATE一对一双向外键联合主键关联

    HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...

随机推荐

  1. BZOJ 3953 Self-Assembly 解题报告

    首先,我们可以先考虑一个暴力一点的算法: 对于任意两个分子,如果它们能以至少一种进行匹配,那么我们就在这两个分子之间连一条边. 然后如果我们能找到一个环,就说明是 unbounded,否则就是 bou ...

  2. WEB黑客工具箱之FireBug介绍

    Firefox扩展Firebug是一个全功能的Web 应用程序调试器,可以协助Web黑客洞悉复杂的Web 应用程序的内部工作机制.它有两种版本:一种可以跨浏览器使用的组件Firebug Lite,另一 ...

  3. WAF 与 RASP 的安装使用大比拼!

    什么是WAF和RASP? WAF全称是Web application firewall,即 Web 应用防火墙.RASP 全称是 Runtime Application Self-protect,即应 ...

  4. HDU3362+状态压缩

    dp[ i ]表示该状态下得所需花费. /* 状态压缩dp dp[i] = min( dp[ i-j ]+cost[ j ] ); 由i-j的状态转到i的状态 */ #include<stdio ...

  5. Lua 笔记

    lua命令: #enter shell lua #excute script file lua xxx.lua lua脚本: #!/usr/local/bin/lua 核心概念: As a exten ...

  6. sql 复杂自动编号错误批量修改方案

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/5133953.html]  前提:自动编号为18位,前4位是年份,中间10位是XXXX,最后四位 ...

  7. ANDROID_MARS学习笔记_S02_007_Animation第一种使用方式:代码

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  8. 《深入理解linux内核》第二章 内存寻址

    三种不同的内存地址 逻辑地址(logical address)包含在linux实际指令中的地址,即分段式地址,是对应的硬件平台段式管理转换前地址由16位的段选择符(segment selector)和 ...

  9. 【HDOJ】1073 Online Judge

    这道题TLE了N多次,完全不明白为什么,稍微改了一下,居然过了.使用gets过的,看讨论帖有人还推荐用hash. #include <stdio.h> #include <strin ...

  10. Understanding Item Import and Debugging Problems with Item Import (Doc ID 268968.1)

    In this Document Purpose Details   Scenario 1: Testing the basic item import with minimum columns po ...