
挂有@的接口和一些描述元注解
本次开发使用的注解
@Id:
必须,定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键
@Table
可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息
@Entity
必须,name为可选,对应数据库中一的个表
@GeneratedValue
可选,
strategy:表示主键生成策略,有AUTO、INDENTITY、SEQUENCE和 TABLE 4种,分别表示让ORM框架自动选择、根据数据库的Identity字段生成、根据数据库表的Sequence字段生成、以及根据一个额外的表生成主键。默认为AUTO
generator:表示主键生成器的名称,这个属性通常和ORM框架相关。例如,Hibernate可以指定uuid等主键生成方式
默认不写采用的是本地的主键生成策咯native
@Column
可选 ,描述了数据库表中该字段的详细定义
@Transient
可选,表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性
@OneToMany
可选,
OneToMany指定了一对多的关系,mappedBy="room"指定了由哪一方一方来维护关联关系,mappedBy指的是多的一方对1的这一方的依赖的属性,(注意:如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表)
@JoinColumn(name = "deptno")
通过 JoinColumn 的name属性指定了外键的名称 deptno (注意:如果我们不通过JoinColum来指定外键的名称,系统会给我们声明一个名称)
@ManyToOne(cascade = CascadeType.ALL)
ManyToOne指定了多对一的关系
CascadeType.PERSIST:级联新增
CascadeType.MERGE:级联合并
CascadeType.REFRESH:级联刷新
CascadeType.REMOVE:级联删除
CascadeType.ALL:以上四种都是
在Passanger表关系定义如下:
@ManyToOne(cascade = { CascadeType.PERSIST,CascadeType.MERGE})
一对一的实例:
一个人对应着一张身份证
package cn.baby.entity;
import javax.persistence.*;
import java.io.Serializable;
/**
* 人
* 人与省份证一对一
* Created by Administrator on 2018/1/3.
*/
@Entity
@Table(name = "PERSON")
public class Person implements Serializable{
@Id
@GeneratedValue
private int id;
@Column
private String name;
//不要初始化,初始化会使对象处于临时状态,会使保存的时候抛异常
@OneToOne
//申明一个外键
@JoinColumn(name = "pk_id")
private Card card;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
}
package cn.baby.entity;
import javax.persistence.*;
import java.io.Serializable;
/**
* 省份证
* 一对一
* Created by Administrator on 2018/1/3.
*/
@Table(name = "CARD")
@Entity
public class Card implements Serializable{
@Id
@GeneratedValue
private int id;
//谁维护表的关系card,保存时,只需要保存card就行
@OneToOne(mappedBy = "card",cascade = CascadeType.ALL)
private Person person;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
测试类
//一对一
@Test
public void onetoone(){
Person person=new Person();
Card card=new Card();
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
person.setName("威哥");
card.setPerson(person);
person.setCard(card);
session.save(card);
transaction.commit();
}
一对多
一个部门对应着对个员工
package cn.baby.entity;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 部门表
* 一个部门下有多个员工
* Created by Administrator on 2017/12/28.
*/
@Entity
@Table(name = "DEPT5")
public class Dept implements Serializable {
@Id
@GeneratedValue
private Integer deptNo;
@Column
private String deptName;
//一个部门下有多个员工 植入set集合 一对多,一定是set集合不是hashset,但是底层实现的是他
@OneToMany(mappedBy = "dept", cascade = CascadeType.ALL)
private Set<Emp> emps=new HashSet<Emp>();
public Integer getDeptNo() {
return deptNo;
}
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}
package cn.baby.entity;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 员工表
* 一个员工对应着一个部门
* Created by Administrator on 2017/12/28.
*/
@Table(name = "EMP5")
@Entity
public class Emp implements Serializable {
@Id
@GeneratedValue
private Integer empNo;
@Column
private String empName;
//一个员工对应着一个部门,植入一个部门属性
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "deptno")
private Dept dept;
//mappedBy谁维护关系,mappedBy指定的是属性名称
@ManyToMany(mappedBy = "emps",cascade = CascadeType.ALL)
private Set<Project> projects=new HashSet<Project>();
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
public Integer getEmpNo() {
return empNo;
}
public void setEmpNo(Integer empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
测试类:
//一对多
@Test
public void onetomany(){
Dept dept=new Dept();
dept.setDeptName("技术部");
Emp emp=new Emp();
emp.setEmpName("小黄");
Emp emp1=new Emp();
emp1.setEmpName("小黑");
emp.setDept(dept);
emp1.setDept(dept);
dept.getEmps().add(emp);
dept.getEmps().add(emp1);
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(dept);
transaction.commit();
}
多对对
一个员工可以写多个项目
一个项目可以被多个员工写
package cn.baby.entity;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 员工表
* 一个员工对应着一个部门
* Created by Administrator on 2017/12/28.
*/
@Table(name = "EMP5")
@Entity
public class Emp implements Serializable {
@Id
@GeneratedValue
private Integer empNo;
@Column
private String empName;
//一个员工对应着一个部门,植入一个部门属性
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "deptno")
private Dept dept;
//mappedBy谁维护关系,mappedBy指定的是属性名称
@ManyToMany(mappedBy = "emps",cascade = CascadeType.ALL)
private Set<Project> projects=new HashSet<Project>();
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
}
public Integer getEmpNo() {
return empNo;
}
public void setEmpNo(Integer empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
}
package cn.baby.entity;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 项目表
* 多对多
* Created by Administrator on 2017/12/28.
*/
@Entity
@Table(name = "PROJECT5")
public class Project implements Serializable {
@Id
@GeneratedValue
private Integer proNo;
@Column
private String proName;
@ManyToMany(cascade = CascadeType.ALL)
//中间表 中间表的名称 本实体对应中间表的列 另一个实体对应中间表的列
@JoinTable(
name = "proemp5",
joinColumns = @JoinColumn(name = "proid"),
inverseJoinColumns = @JoinColumn(name = "empid"))
//员工集合
private Set<Emp> emps=new HashSet<Emp>();
public Integer getProNo() {
return proNo;
}
public void setProNo(Integer proNo) {
this.proNo = proNo;
}
public String getProName() {
return proName;
}
public void setProName(String proName) {
this.proName = proName;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
}
}
测试类
//duo对多
@Test
public void manytomany(){
Emp emp=new Emp();
emp.setEmpName("小黄");
Emp emp1=new Emp();
emp1.setEmpName("小黑");
Project project=new Project();
project.setProName("易买网");
Project project1=new Project();
project1.setProName("易买网1");
emp.getProjects().add(project);
emp.getProjects().add(project1);
emp1.getProjects().add(project);
project.getEmps().add(emp);
project1.getEmps().add(emp);
project.getEmps().add(emp1);
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
session.save(emp);
session.save(emp1);
transaction.commit();
}