03-hibernate注解-关系映射级别注解-一对一
实体之间的映射关系
一对一:一个公民对应一个身份证号码
一对多(多对一):一个人可以有多个银行账号
多对多:一个学生有多个老师,一个老师有多个学生。
一对一单向外键关联
@OneToOne(cascade=cascadeType.ALL)(cascade表示级联关系)
@JoinColumn(name="pid",unique=true) name表示外键。
注意:保存时候应该先保存外键对象,再保存主表对象。
第一步:先建立外键属于的表的实体类:身份证类
注意:1,因为pid类型不是int,所以不能自动生成,所以给他指定一个生成器@GeneratedValue,并且构建一个生成器,生成策略为手工赋值@GenericGenerator(name="pid",strategy="assigned")。2,因为String类型做主键需要控制大小,这里指定长度18.
package oto_fk; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import org.hibernate.annotations.GenericGenerator; /*身份证类*/
@Entity
public class IdCard { @Id
@GeneratedValue(generator="pid")//指定一个生成器为pid
@GenericGenerator(name="pid",strategy="assigned")//构建一个生成器,生成策略strategy为手工赋值
@Column(length=18)
private String pid;//身份证号码
private String sname;//学生姓名 public IdCard()
{ }
public IdCard(String pid, String sname) {
//super();
this.pid = pid;
this.sname = sname;
} public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
}
第二步:建立学生实体类,这个学生类包含身份证的主键,作为外键。
注意:1,定义id为主键@Id,并且自动增长@GeneratedValue。
2,定义外键属性,并且给外键属性的get方法,加上注解:一对一的全级联关系。指定被控类(身份证类)的主键字段(pid)。
3,因为主键是自动增长的,所以,有参数的构造方法里面,不需要sid这个属性,去掉。
package oto_fk; import java.util.Date; import javax.persistence.CascadeType;
import javax.persistence.Entity;/*JPA主键*/
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table; /*学生实体类*/
@Entity
@Table(name="Students",schema="sys")
public class Students { private IdCard card;//身份证对象 private int sid;
private String gender;//性别
private Date birthday;
private String major;//专业 public Students()
{ } public Students(IdCard card, String gender, Date birthday, String major) {
//super();
this.card=card;
this.gender = gender;
this.birthday = birthday;
this.major = major;
} @Id
@GeneratedValue //主键自动增长
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
@OneToOne(cascade=CascadeType.ALL)//全级联的级联关系
@JoinColumn(name="pid",unique=true)//被控类对应的主键为pid
public IdCard getCard() {
return card;
} public void setCard(IdCard card) {
this.card = card;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getMajor() {
return major;
} public void setMajor(String major) {
this.major = major;
}
}
第三步:给两个类注册到配置文件里面:

第四步:建立测试类:
package oto_fk;
import java.util.EnumSet;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
import org.junit.Test; public class testStudents { @Test
public void testSchemaExport()
{
//创建服务注册对象
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
//创建Metadata对象
Metadata metadata =new MetadataSources(serviceRegistry).buildMetadata();
//创建SchemaExport对象
SchemaExport export = new SchemaExport();
export.create(EnumSet.of(TargetType.DATABASE),metadata);
} }
第五步:调试成功,成功生成两个表:

测试一下刚刚的效果:建立一个测试用例:
注意:两个类对象的保存顺序是,先保存外键表身份证,再保存学生类。
@Test
public void testAddStudents()
{
//创建配置对象
Configuration config=new Configuration().configure();
//创建服务注册对象。
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
//创建会话工厂对象
SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
//创建会话对象
Session session=sessionFactory.openSession();
//开启事务
Transaction transaction=session.beginTransaction(); //生成一个身份证对象
IdCard card=new IdCard("232423232432","张无忌");
//再生成一个学生对象
Students s=new Students(card,"男",new Date(),"计算机"); session.save(card);
session.save(s);
transaction.commit(); }
查询结果:以下结果可见,身份证主键顺利存到学生类,作为主键,并且学生类主键已经为1了。


03-hibernate注解-关系映射级别注解-一对一的更多相关文章
- Hibernate注解关系映射
Hibernate Annotation关系映射的几种类型映射用法及使用方法(说明:以前实例的实体是user和role,主键分别是userid和roleid) 1)一对一外键关联映射(单向) @O ...
- hibernate(3) —— 关系映射
hibernate中关系映射指的是实体类与实体类间的关系.和数据库中表与表之间的关系类似,有一对一,多对一,一对多,多对多四种映射关系. 一:一对一映射 两个对象之间是一对一的关系,如人和身份证之间是 ...
- 01-hibernate注解:类级别注解准备工作
注解简介: 目的:为了简化繁琐的ORM映射文件(.hbm)的配置. JPA与hibernate的关系 JPA:全称 java Persistence API(java持久化API接口) JPA注解是J ...
- Hibernate关系映射(注解)
1.类级别注解 @Entity 映射实体类 @Table 映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bea ...
- Hibernate学习之属性级别注解
© 版权声明:本文为博主原创文章,转载请注明出处 属性级别注解 添加方式 1. 写在属性字段上面 2. 写在属性getter方法上面 @Id:必须,定义了映射到数据库表的主键属性,一个实体可以有一个或 ...
- hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)
对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待. 一对一(主键关联,和单向的外键关 ...
- Hibernate表关系映射之一对一映射
一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...
- hibernate 实体关系映射笔记
@经常使用属性说明: @Entity:实体类 @Table:指定相应数据表 @Id:主键,使用能够为null值的类型,假设实体类没有保存到数据库是一个暂时状态 @Col ...
- Hibernate表关系映射之多对多映射
一.多对多的实现原理 在数据库中实现多对多的关系,必须使用连接表.也就是用一个独立的表来存入两个表的主键字段,通过遍历这张表来获取两表的关联关系. 而在我们的对象中,多对多是通过两者对象类中互相建立对 ...
随机推荐
- coreseek 段错误 (core dumped) 问题
coreseek建立索引出现上面问题经过测试发现有下面几个原因: 1. 分词配置文件不存在 uni.lib 2. uni.lib配置文件格式不正确
- 2. let和const命令--ES6
1. let命令 let 命令不存在变量提升let 命令 只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is ...
- VB查询数据库之终极篇——机房收费系统总结(七)
机房收费系统总结系列到此就算是要结束了.在做机房收费系统之前,做了学生管理系统,可以说,对机房收费系统的帮助很大. 在机房收费系统中,数据库的查询,数据写入数据库,更改数据库内的信息等一些操作在学生信 ...
- JZYZOJ 1375 双亲数 莫比乌斯反演
http://172.20.6.3/Problem_Show.asp?id=1375 网上搜推理图. 有一段没有写莫比乌斯反演都快忘了..数学能力--,定理完全不会推,但是这道题整体来说应该是比较好写 ...
- 【博弈论】【SG函数】【线段树】Petrozavodsk Summer Training Camp 2016 Day 9: AtCoder Japanese Problems Selection, Thursday, September 1, 2016 Problem H. Cups and Beans
一开始有n个杯子,每个杯子里有一些豆子,两个人轮流操作,每次只能将一个豆子移动到其所在杯子之前的某个杯子里,不过可以移动到的范围只有一段区间.问你是否先手必胜. 一个杯子里的豆子全都等价的,因为sg函 ...
- 【递归】【线段树】【堆】AtCoder Regular Contest 080 E - Young Maids
给你一个1~n的排列p,n是偶数,每次从中任选一对相邻的数出来,插到排列q的开头,如此循环,问你所能得到的字典序最小的排列q. 我们先确定q开头的两个数q1,q2,q1一定是p的奇数位的最小的数,而q ...
- MySort
实验概述: 本次试验的内容:模拟实现Linux下Sort -t : -k 2的功能.参考Sort的实现.提交码云链接和代码运行截图. 截图如下 实验过程 在实验课上真的很崩溃,可以说脑子里一团乱麻,下 ...
- mybatis异常: invalid comparison: java.util.ArrayList and java.lang.String] with root cause
mybatis中使用动态sql,报错: invalid comparison: java.util.ArrayList and java.lang.String] with root cause 是由 ...
- [bzoj1014](JSOI2008)火星人 prefix (Splay维护哈希)
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀. 比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...
- codevs 1779 单词的划分
1779 单词的划分 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Problem有一个很长的由小写字母组成字符串.为了便于对 ...