03-hibernate注解-关系映射级别注解-一对一
2017-11-12 22:33
525 查看
实体之间的映射关系
一对一:一个公民对应一个身份证号码一对多(多对一):一个人可以有多个银行账号
多对多:一个学生有多个老师,一个老师有多个学生。
一对一单向外键关联
@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; } }
第三步:给两个类注册到配置文件里面:
![](https://images2017.cnblogs.com/blog/779030/201711/779030-20171112223053841-1216398006.png)
第四步:建立测试类:
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); } }
第五步:调试成功,成功生成两个表:
![](https://images2017.cnblogs.com/blog/779030/201711/779030-20171112223219919-1179593049.png)
测试一下刚刚的效果:建立一个测试用例:
注意:两个类对象的保存顺序是,先保存外键表身份证,再保存学生类。
@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了。
![](https://images2017.cnblogs.com/blog/779030/201711/779030-20171112224245059-288730757.png)
![](https://images2017.cnblogs.com/blog/779030/201711/779030-20171112224220403-424631353.png)
相关文章推荐
- Hibernate关系映射级别注解(一对一双向外键关联、一对一双向外键联合主键)
- Hibernate关系映射级别注解(一对一单向外键关联)
- Hibernate关系映射级别注解(多对一单向外键关联)
- hibernate映射关系级别注解
- Hibernate 基于注解的方式 实现的关系映射案例(一对一关系,一对多关系,多对多关系)
- Hibernate之对象关系映射03一对一单向外键关联
- 【注解】hibernate关系映射级别注解
- Hibernate关系映射级别注解(一对多单向外键关联、一对多(多对一)双向外键关联)
- Hibernate关系映射级别注解(多对多单向外键关联、多对多双向外键关联)
- Hibernate之对象关系映射06一对一双向外键关联
- hibernate annotation注解方式来处理映射关系
- Hibernate 、多表关联映射 - 一对一关系映射(one- to-one)
- Hibernate一对一关联映射(注解)
- Hibernate关系映射(一) 基于外键的单向一对一
- Hibernate中,One2Many和Many2One的双向映射关系的基于注解Annotation实现方式
- Hibernate的映射关系与级联(一对一、一对多、多对多)
- hibernate学习(设计一对一 关系 映射)
- Hibernate关系映射(1)_一对一单向外键关联
- Hibernate关系映射一对一