【Hibernate】--一对一关联、联合主键
一、数据模型
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
三、双向一对一外键关联
A.配置文件描述
<!-- 被控方:指定stu属性被IdClass中的pid属性控制 -->
<one-to-one name="stu" property-ref="pid"/>
B.注解描述
//只要是双向关联就一定要指定mappedBy,将控制权交给指定的一方
@OneToOne(mappedBy="pid")
private Student stu;
四、联合主键
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类中的属性作为添加到某实体类)
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.配置文件描述
<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】--一对一关联、联合主键的更多相关文章
- Hibernate注解映射联合主键的三种主要方式
今天在做项目的时候,一个中间表没有主键,所有在创建实体的时候也未加组件,结果报以下错误: org.springframework.beans.factory.BeanCreationException ...
- Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法
联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将该类注解为 ...
- Jpa/Hibernate ManyToOne 关联非主键列 延迟加载失效
@ManyToOne配置延迟加载,如果是关联主键列, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "billid", ...
- Hibernate 一对一映射(共享主键)
- Hibernate联合主键映射
1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...
- hibernate 联合主键生成机制(组合主键XML配置方式)
hibernate 联合主键生成机制(组合主键XML配置方式) 如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体 ...
- 04.Hibernate一对一关联
前言:本文主要介绍使用Hibernate映射一对一的关联关系的两种方式:使用外键映射.使用主键映射. 1.数据库表的一对一关联关系 本文根据客户信息表(tb_customer)和地址信 ...
- Nhibernate 一对一关系映射(主键映射)
参考:点击这里 妈的,搞了一天了,终于可以了,现在总结下,以防下次再出现这样痛苦的问题了,有两个表:user(用户)和Blog(设置表),它们之间的关系正如我所说的是一对一的关系.现在我们来映射这两个 ...
- HIBERNATE一对一双向外键联合主键关联
HIBERNATE一对一双向外键联合主键关联: 一. 创建主键类:这个主键必须实现serializedable接口和重写其中的hashCode方法和equals方法:为主键类添加一个叫做@Embedd ...
随机推荐
- chrome浏览器扩展--QQ群查看器(1)
QQ群查看器--chrome浏览器扩展 源码及程序下载地址:http://pan.baidu.com/share/link?shareid=3636190804&uk=1678089569 关 ...
- 安装ubuntu12.04LTS卡住以及花屏问题
昨天在XP下用grub4dos安装了ubuntu12.04LTS,总体上还算比较顺利,中途有碰到两个异常问题,解决了记录一下. 问题一:安装过程中读取ISO镜像文件时,卡在"checking ...
- poj 2828 Buy Tickets (线段树(排队插入后输出序列))
http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissio ...
- BZOJ 3955 Surely You Congest 解题报告
首先,我们可以求出源为 $1$ 号点的最短路图以及各个点到 $1$ 号点的最短路. 然后我们考虑那些距离不同的点,是一定不会发生拥堵现象的. 然后我们就只需要考虑那些距离相同的点,就相当于做一个最大流 ...
- POJ2200+全排列模拟
简单. 手动的实现全排列 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<a ...
- 解决Ubuntu root账户的问题
问题的提出:在Linux环境下,许多操作需要有管理员权限才能进行.如果没有root权限,就连基本的文件拷贝操作都只能在用户文件夹下进行,而对于Ubuntu系统,安装时是没有设定root帐号的,那么怎样 ...
- asp.net 中 .ASPX 与.CS文件的关系
.aspx文件继承自.cs文件 虽然一个 Web 窗体页由两个单独的文件组成,但这两个文件在应用程序运行时形成了一个整体.项目中所有 Web 窗体的代码隐藏类文件都被编译成由项目生成的动态链接库 (. ...
- [jobdu]第一个只出现一次的字符
刚开始还在想双指针,完全没必要.然后最土的可以扫两遍O(n),用一个数组记录出现次数.然后想到如果数组里记录出现的位置,可以只扫一遍O(n),第二遍扫字符集就行了. #include <iost ...
- Spring事务管理--多个ORM框架在使用时的情况分析
公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在 ...
- Android-相册效果(图片缩放 自由滑动)
先上图: 很多时候 我们会有这么一个需求: 展示一组图片 每个Item的图片 可以自由拉伸 滑动 焦点不冲突 网上有很多实现方法 通过自定义Gallery和ImageView来实现 个人不是很推荐 在 ...