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表关系映射之多对多映射
一.多对多的实现原理 在数据库中实现多对多的关系,必须使用连接表.也就是用一个独立的表来存入两个表的主键字段,通过遍历这张表来获取两表的关联关系. 而在我们的对象中,多对多是通过两者对象类中互相建立对 ...
随机推荐
- Visual Studio 2017创建XAML文件
Visual Studio 2017创建XAML文件 在Visual Stuido 2015中,在已经创建好的项目中添加XAML文件,只要右击项目,单击“添加”|“新建项”命令,然后从“添加新项” ...
- python datetime处理时间(转)
Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.time模块,它提供 的接口与C标准库time.h基本一致.相比于time模块,datetime模块的接 ...
- 【LA 3641】 Leonardo's Notebook (置换群)
[题意] 给出26个大写字母组成 字符串B问是否存在一个置换A使得A^2 = B [分析] 置换前面已经说了,做了这题之后有了更深的了解. 再说说置换群. 首先是群. 置换群的元素是置换,运算时是 ...
- BZOJ 1109 [POI2007]堆积木Klo(树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1109 [题目大意] Mary在她的生日礼物中有一些积木.那些积木都是相同大小的立方体. ...
- 【判断解是否可行-二分】POJ1064-Cable master
http://poj.org/problem?id=1064 [题目大意] 给出几条绳子的长度,问如果要切出k条长度相等的绳子,这k条绳子最常多长? [思路] 二分.把下界设为0,上界设为所有绳子长度 ...
- Problem H: 零起点学算法109——单数变复数
#include <stdio.h> #include<string.h> int main(void) { int n; ]; scanf("%d",&a ...
- Problem A: 自定义函数strcomp(),实现两个字符串的比较
#include<stdio.h> int strcmp(char *str1,char *str2) { if(str1!=NULL&&str2!=NULL) { whi ...
- [转] json字符串转换为JSONObject和JSONArray
一.下载json 具体到http://www.json.org/上找java-json下载,并把其放到项目源代码中,这样就可以引用其类对象了 二.具体转化过程 //JSONObject String ...
- android unity3d开发学习第一步
1:下载unitysetup 开发环境 http://unity3d.com/unity/download/download-windows 2:下载三维制作软件 制作我们需要的场景 http://u ...
- java多线程之Concurrent包
1.在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题. 2.通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的 ...