一、什么是注解?
解析:來源:Hibernate提供了Hibernate Annotations擴展包,它可以替換復雜的hbm.xml文件( Annotations擴展包是hibernate-annotation-3.4.0GA.zip)
作用:使得Hibernate程序的開發大大的簡化。利用注解后,可不用定義持久化類對應的*.hbm.xml,而直接以注解方式寫入持久化類的實現中。
二、注解配置持久化類常用注解。
| 注解 | 含義和作用 |
| @Entity | 將 一個類聲明為一個持久化類 |
| @Id | 聲明了持久化類的標識屬性(相當於數據表的主鍵) |
| @GeneratedValue | 定義標識屬性值的生成策略 |
| @Table | 為持久化類映射指定表(table)、目錄(catalog)和schema的名稱。默認值,持久化類名,不帶包名 |
| @UniqueConstraint | 定義表的唯一約束 |
| @Lob | 表示屬性將被持久化為Blob或者Clob類型 |
| @Column | 將屬性映射到列 |
| @Transient | 忽略這些字段和屬性,不用持久化到數據庫 |
三.
注解配置對象關聯關系
(一)@OneToOne建立持久化類之間一對一關聯關系
場景一:員工對應一張身份證
Emp(員工表)
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類
關鍵代碼:
//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();
}
}

