挂有@的接口和一些描述元注解
本次开发使用的注解
@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")@Entitypublic 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")@Entitypublic 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")@Entitypublic 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(); ???}
Hibernate的注解似开发
原文地址:https://www.cnblogs.com/liuzhiw/p/8186264.html