挂有@的接口和一些描述元注解
本次开发使用的注解
@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(); }