一、什么是注解?
解析:来源: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(); } }