一、数据模型

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

public class Student implements java.io.Serializable{

	private static final long serialVersionUID = 1L;

	private Integer sid;

	private String sname;

	private IdClass pid;

	public Integer getSid() {
return sid;
} public void setSid(Integer sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public IdClass getPid() {
return pid;
} public void setPid(IdClass pid) {
this.pid = pid;
}
}

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

public class IdClass implements java.io.Serializable{

	private static final long serialVersionUID = 1L;

	private String pid;

	private String provience;

	private Student stu;

	public String getPid() {
return pid;
} public void setPid(String pid) {
this.pid = pid;
} public String getProvience() {
return provience;
} public void setProvience(String provience) {
this.provience = provience;
} public Student getStu() {
return stu;
} public void setStu(Student stu) {
this.stu = stu;
}
}

二、单向唯一关联

A.配置文件描述

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

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

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

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

三、双向一对一外键关联

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

A.配置文件描述

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

B.注解描述

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

四、联合主键

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

public class IdCardPK implements Serializable{

	private static final long serialVersionUID = 1L;

	private String pid;

	private String bloodType; //血型

	//*******************

}

A.配置文件描述

<hibernate-mapping package="com.hibernate.orm.ufk">
<class name="IdClass" table="id_class_info">
<!-- 联合主键 -->
<composite-id name="idCardPK" class="com.hibernate.orm.ufk.IdCardPK">
<key-property name="pid" column="p_id" length="20" type="string"/>
<key-property name="bloodType" column="blood_type" length="10" type="string"/> <!-- 不能再指定 generator
<generator class="assigned"/>
-->
</composite-id> <property name="provience" column="provience" not-null="false" type="string"/>
</class>
</hibernate-mapping>

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

<many-to-one name="pid" cascade="all">
<column name="p_id" unique="true"/>
<column name="blood_type"/>
</many-to-one>

B.注解描述

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

@Embeddable
public class IdCardPK implements Serializable{ private static final long serialVersionUID = 1L; @Column(name="p_id",nullable=false, length=20)
private String pid; @Column(name="blood_type",nullable=false)
private String bloodType; //血型 }

身份信息修改如下

@EmbeddedId
private IdCardPK idCardPK;

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

@OneToOne(cascade=CascadeType.ALL)
@JoinColumns({
@JoinColumn(name="p_id",referencedColumnName="p_id"),
@JoinColumn(name="blood_type",referencedColumnName="blood_type")
})
private IdClass pid;

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

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

public class IdClass{

	private String provience;

	private String bloodType;

	public String getProvience() {
return provience;
} public void setProvience(String provience) {
this.provience = provience;
} public String getBloodType() {
return bloodType;
} public void setBloodType(String bloodType) {
this.bloodType = bloodType;
}
}

A.配置文件描述

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

<hibernate-mapping package="com.hibernate.orm.component">
<class name="Student" table="student">
<id name="sid" type="integer" length="50">
<generator class="identity"/>
</id>
<property name="sname" column="s_name" not-null="false" type="string"/> <!-- 组件关联配置 -->
<component name="pid" class="IdClass">
<property name="provience" column="provience" length="20"/>
<property name="bloodType" column="blood_type" length="10"></property>
</component>
</class>
</hibernate-mapping>

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

//和组件关联
@Embedded
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. C#如何控制方法的执行时间,超时则强制退出方法执行

    转自:http://outofmemory.cn/code-snippet/1762/C-how-control-method-zhixingshijian-chaoshi-ze-force-quit ...

  2. google 开放I/O源码

    在这款应用程序中谷歌对部分功能.API和设计架构进行了非常详细的阐述,其中包括碎片.程序加载.服务.广播.接收器.警告.通知.SQLite数据库.内容提供商.Action Bar.导航Drawer和G ...

  3. sjtu1586 Dog

    Description 隔壁村的阿黑的Dog没有跑, 但Dog已经15岁了, 相当于人类达到了79岁. 为了防止Dog患上犬类认知障碍 (Canine cognitive dysfunction, C ...

  4. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  5. [线段树]HDOJ5091 Beam Cannon

    题意:给n, w, h  (1 <= N <= 10000,1 <= W <= 40000,1 <= H <= 40000) $w\times h$是可以射到的范围 ...

  6. android 业务需求: 先干掉自己, 在重启自己

    // 重启应用 public void restartApp() { Intent intent = new Intent(); // 参数1:包名,参数2:程序入口的activity intent. ...

  7. Linux使用wake_up_interruptible()唤醒注册到等待队列上的进程

    http://blog.sina.com.cn/s/blog_4770ef020101h48l.html     功能:唤醒注册到等待队列上的进程 原型:     #include     void ...

  8. html5 动画精灵

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  9. Java之sleep和wait的区别

    这个问题在面试线程方面的知识时,基本上属于必问的问题.因此这里有必要做一个较为详细的总结. 区别一 首先需要明白的是这两个方法根本来自不同的类,sleep来自Thread,wait来自Object类. ...

  10. sdut2536字母哥站队(dp)

    简单DP  说是简单 还是推了好一会 推出来觉得好简单 保留当前i的最小值 dp[i] = min(dp[i],dp[j]+i-j-1) j<i #include <iostream> ...