实体之间的映射关系

一对一:一个公民对应一个身份证号码

一对多(多对一):一个人可以有多个银行账号

多对多:一个学生有多个老师,一个老师有多个学生。

一对一单向外键关联

@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了。

最新文章

  1. react初始(1)
  2. jquery对单选和下拉框的操作
  3. <<< html编码中js和html编码不一致导致乱码
  4. Sprint第三个冲刺(第三天)
  5. python 脚本传递参数
  6. javascript 火狐event.keyCode不能使用event is not defined
  7. C++ builder 操作Excel方法(据网上资料整理)
  8. 很牛逼的android真机调试,手机、平板、电视都可
  9. careercup-C和C++ 13.6
  10. (转载)MySQL关键字GROUP BY的使用
  11. 富文本编辑器CKEDITOR的使用配置(问题注解)
  12. C#基础知识-流程控制的应用(四)
  13. Mac实用操作技巧(三)
  14. java面试一、1.4锁机制
  15. Java基础-方法
  16. Oracle EBS CST 成本请求报错
  17. 【转】MPU6050的数据获取、分析与处理
  18. 既之前的基础,先写个简单的PHP 与数据库 的数据交流
  19. Python3基础 print \" 输出单引号与双引号
  20. Linux socat轻松实现TCP/UDP端口转发

热门文章

  1. luogu P1047 校门外的树
  2. Server-side Query interception with MS SQL Server
  3. 使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历
  4. ArcGIS 10.2 三维分析工具箱部分工具不能用
  5. java通过UUID生成16位唯一订单号
  6. SqlServer查看对象(表、存储过程、函数)在哪些地方被引用或引用哪些地方
  7. propertychange方法
  8. Android疑难杂症之android:configChanges="orientation" 无效
  9. EasyUI-子页面增加显示tabs的一个问题
  10. Win7双屏显示设置