03-hibernate注解-关系映射级别注解
Posted 美好的明天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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注解-关系映射级别注解的主要内容,如果未能解决你的问题,请参考以下文章