1、什麼是註解?java
解析:來源:Hibernate提供了Hibernate Annotations擴展包,它能夠替換複雜的hbm.xml文件( Annotations擴展包是hibernate-annotation-3.4.0GA.zip)數據庫
做用:使得Hibernate程序的開發大大的簡化。利用註解後,可不用定義持久化類對應的*.hbm.xml,而直接以註解方式寫入持久化類的實現中。session
2、註解配置持久化類經常使用註解。app
註解 | 含義和做用 |
@Entity | 將 一個類聲明爲一個持久化類 |
@Id | 聲明瞭持久化類的標識屬性(至關於數據表的主鍵) |
@GeneratedValue | 定義標識屬性值的生成策略 |
@Table | 爲持久化類映射指定表(table)、目錄(catalog)和schema的名稱。默認值,持久化類名,不帶包名 |
@UniqueConstraint | 定義表的惟一約束 |
@Lob | 表示屬性將被持久化爲Blob或者Clob類型 |
@Column | 將屬性映射到列 |
@Transient | 忽略這些字段和屬性,不用持久化到數據庫 |
三.測試
註解配置對象關聯關係ui
(一)@OneToOne創建持久化類之間一對一關聯關係this
場景一:員工對應一張身份證編碼
Emp(員工表)spa
package cn.ljm.entity; import javax.persistence.*; /** * Created by win7 on 2017/2/16. */ @Entity @Table(name = "Emp2") public class Emp { private Integer eid; @Column private String ename; private Idcard idcard; @OneToOne @JoinColumn(name = "iid") public Idcard getIdcard() { return idcard; } public void setIdcard(Idcard idcard) { this.idcard = idcard; } @Id @GeneratedValue public Integer getEid() { return eid; } public void setEid(Integer eid) { this.eid = eid; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } }
Idcard類hibernate
關鍵代碼:
//mappedBy 表示由craid所在的對象維護關聯關係
@OneToOne(mappedBy="cardid")
1 package cn.ljm.entity; 2 3 import javax.persistence.*; 4 5 /** 6 * Created by win7 on 2017/2/16. 7 */ 8 @Entity 9 @Table(name = "Idcard2") 10 public class Idcard { 11 @Id 12 @GeneratedValue 13 private Integer iid; 14 private String inum; 15 @OneToOne(mappedBy = "idcard",cascade = CascadeType.ALL) 16 private Emp emp; 17 18 public Integer getIid() { 19 return iid; 20 } 21 22 public void setIid(Integer iid) { 23 this.iid = iid; 24 } 25 26 public String getInum() { 27 return inum; 28 } 29 30 public void setInum(String inum) { 31 this.inum = inum; 32 } 33 34 public Emp getEmp() { 35 return emp; 36 } 37 38 public void setEmp(Emp emp) { 39 this.emp = emp; 40 } 41 }
測試類
1 import cn.ljm.entity.Emp; 2 import cn.ljm.entity.Idcard; 3 import org.hibernate.Session; 4 import org.hibernate.SessionFactory; 5 import org.hibernate.Transaction; 6 import org.hibernate.cfg.Configuration; 7 import org.junit.After; 8 import org.junit.Before; 9 import org.junit.Test; 10 11 /** 12 * Created by win7 on 2017/2/16. 13 */ 14 public class test { 15 Configuration cfg; 16 Session session; 17 Transaction tx; 18 @Before 19 public void myBefore(){ 20 cfg=new Configuration().configure("hibernate2.cfg.xml"); 21 SessionFactory factory=cfg.buildSessionFactory(); 22 session= factory.getCurrentSession(); 23 tx= session.beginTransaction(); 24 } 25 @After 26 public void myAfter(){ 27 tx.commit(); 28 } 29 @Test 30 public void test1(){ 31 Emp emp=new Emp(); 32 Idcard idcard=new Idcard(); 33 emp.setEname("123"); 34 idcard.setInum("321"); 35 idcard.setEmp(emp); 36 emp.setIdcard(idcard); 37 session.save(idcard); 38 } 39 }
二)@OneToMang and @MangToOne(創建雙向關聯一對多多對一)
場景一:一個部門對應多個員工;多個員工對應一個部門
Emp類
package cn.happy.entity.one; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; /** * 1.2 員工類 * @author happy * */ @Entity @Table public class Emp { @Id private Integer empId; @Column private String empName; @ManyToOne @JoinColumn(name="deptNo") private Dept dept; public Integer getEmpId() { return empId; } public void setEmpId(Integer empId) { this.empId = empId; } 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; } }
Dept類
package cn.happy.entity.one; import java.util.HashSet; import java.util.Set; //jpa註解 import javassist.expr.NewArray; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.GenericGenerators; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; /** * 1.1 部門表 uuid guid 全球惟一編碼 自增列 序列 32位16進制數 * * @author happy * */ //Dept部門類能夠被HIbernate進行管理 @Entity @Table(name="Dept") public class Dept { @Id //引用生成器 @GeneratedValue private Integer deptNo; //默認Hibernate管理 private String deptName; @OneToMany(mappedBy="dept") @LazyCollection(LazyCollectionOption.FALSE) private Set<Emp> emps=new HashSet<Emp>(); public Set<Emp> getEmps() { return emps; } public void setEmps(Set<Emp> emps) { this.emps = emps; } 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; } }
測試類
package cn.happy.entity.one; import org.hibernate.Session; import org.hibernate.Transaction; import cn.happy.entity.Dept; import cn.happy.entity.Emp; import cn.happy.until.HibernateUtil; public class mangoneonemang { public static void main(String[] args) { Session session = HibernateUtil.currentSession(); Transaction tx = session.beginTransaction(); // Dept dept = (Dept)session.load(Dept.class, 21); // // System.out.println(dept.getDeptName()); Emp emp = (Emp)session.load(Emp.class, 21); System.out.println(emp.getEmpName()); tx.commit(); HibernateUtil.closeSession(); } }
(三)@MangToMang(創建雙向關聯一對多多對一)
場景一:一個員工對應多個項目;一個項目對應多個員工(多對多的關聯)
Employee類
關鍵代碼解讀:
//準備的第三張表就是員工和項目的關係
@JoinTable( name="Myproemp",//表的名字 joinColumns=@JoinColumn(name="empid"),//emp員工和第三表的外鍵關係 inverseJoinColumns=@JoinColumn(name="proid")//Project員工和第三表的外鍵關係 )
package entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; /* * 員工表 * */ @Entity @Table(name="MyEmployee") public class Employee { @Id @GeneratedValue private Integer empid;//員工編號 private String empname;//員工名稱 //準備一個項目集合 @ManyToMany(cascade=CascadeType.ALL) //準備的第三張表就是員工和項目的關係 @JoinTable( name="Myproemp",//表的名字 joinColumns=@JoinColumn(name="empid"),//emp員工和第三表的外鍵關係 inverseJoinColumns=@JoinColumn(name="proid")//Project員工和第三表的外鍵關係 ) private Set<Project> pros=new HashSet<Project>(); public Set<Project> getPros() { return pros; } public void setPros(Set<Project> pros) { this.pros = pros; } public Employee(String empname) { super(); this.empname = empname; } public Employee(Integer empid, String empname) { this.empid = empid; this.empname = empname; } public Employee() { } public Integer getEmpid() { return empid; } public void setEmpid(Integer empid) { this.empid = empid; } public String getEmpname() { return empname; } public void setEmpname(String empname) { this.empname = empname; } }
project類
關鍵代碼:
//聲明員工集合
@ManyToMany(mappedBy="pros")//將控制權交由員工
package entity; import java.util.HashSet; import java.util.Set; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table; /* * 項目表 * */ @Entity @Table(name="MyProject") public class Project { @Id @GeneratedValue private Integer proid;//項目編號 private String proname;//項目名稱 //聲明員工集合 // @ManyToMany(mappedBy="pros")//將控制權交由員工 @ManyToMany(mappedBy="pros") private Set<Employee> emps=new HashSet<Employee>(); public Set<Employee> getEmps() { return emps; } public void setEmps(Set<Employee> emps) { this.emps = emps; } public Project(String proname) { this.proname = proname; } public Integer getProid() { return proid; } public void setProid(Integer proid) { this.proid = proid; } public String getProname() { return proname; } public void setProname(String proname) { this.proname = proname; } public Project(Integer proid, String proname) { this.proid = proid; this.proname = proname; } public Project() { } }
測試類
package test; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import util.HibernateUtil; import entity.Employee; import entity.Project; /* * 多對多關係 * */ public class Test { public static void main(String[] args) { //查詢 //select(); //添加數據 innesrt(); } //添加數據 public static void innesrt(){ //獲取Session Session session=HibernateUtil.currentSession(); //開啓事務 Transaction tx = session.beginTransaction(); //構建兩個項目 Project pro1=new Project("項目一"); Project pro2=new Project("項目二"); //構建多個員工 Employee emp1=new Employee("巴黎的雨季"); Employee emp2=new Employee("盛夏的果實"); //關係交由員工處理 emp1.getPros().add(pro1); emp1.getPros().add(pro2); emp2.getPros().add(pro2); //保存 session.save(emp1); session.save(emp2); //提交事務 tx.commit(); //關閉鏈接 HibernateUtil.closeSession(); } //查詢數據 public static void select(){ //獲取Session Session session=HibernateUtil.currentSession(); //開啓事務 Transaction tx = session.beginTransaction(); String hql="from Project"; List<Project> list = session.createQuery(hql).list(); for (Project item : list) { System.out.println(item.getProname()+item.getProid()); for (Employee emp : item.getEmps()) { System.out.println(emp.getEmpid()+emp.getEmpname()); } } //Project pro = (Project)session.get(Project.class, 3); //System.out.println(pro.getProname()); //提交事務 tx.commit(); //關閉鏈接 HibernateUtil.closeSession(); } }