Hibernate的註解似開發
掛有@的接口和一些描述元註解
本次開發使用的註解
@Id:
必須,定義了映射到數據庫表的主鍵的屬性,一個實體只能有一個屬性被映射為主鍵
@Table
可選,通常和@Entity配合使用,只能標註在實體的class定義處,表示實體對應的數據庫表的信息
@Entity
必須,name為可選,對應數據庫中一的個表
@GeneratedValue
可選,
strategy:表示主鍵生成策略,有AUTO、INDENTITY、SEQUENCE和 TABLE 4種,分別表示讓ORM框架自動選擇、根據數據庫的Identity字段生成、根據數據庫表的Sequence
generator:表示主鍵生成器的名稱,這個屬性通常和ORM框架相關。例如,Hibernate可以指定uuid等主鍵生成方式
默認不寫采用的是本地的主鍵生成策咯native
@Column
可選 ,描述了數據庫表中該字段的詳細定義
@Transient
可選,表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性
@OneToMany
可選,
OneToMany指定了一對多的關系,mappedBy="room"指定了由哪一方一方來維護關聯關系,mappedBy指的是多的一方對
@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(); }
Hibernate的註解似開發