在hibernate中,通常配置對象關系映射關系有兩種,一種是基於xml的方式,另一種是基於annotation的注解方式,熟話說,蘿卜青菜,可有所愛,每個人都有自己喜歡的配置方式,我在試了這兩種方式以后,發現使用annotation的方式可以更簡介,所以這里就簡單記錄下通過annotation來配置各種映射關系,在hibernate4以后已經將annotation的jar包集成進來了,如果使用hibernate3的版本就需要引入annotation的jar包。
配置持久化類常用的注解:
注:GeneratedValue指定了標識符的生成策略。jpa提供了4種標准用法。
01.AUTO:根據不同的數據庫選擇不同的策略
02.TABLE:使用表保存id值
03.INDENITY:使用數據庫自動生成主鍵
04.SEQUENCE:使用序列創建主鍵(如Oracle)
配置關聯關系常用的注解:
話不多說了,待大家來看看到底怎么用的才最重要
1.注解配置對象關聯關系之 一對一(學生對學生證)
Student.java

package cn.zhang.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; //學生實體類 @Entity @Table(name="Student2161") public class Student { @Id //主鍵 @GeneratedValue //主鍵生成策略 private Integer sid; private String name; //配置之間的一對一的關系 //cascade={CascadeType.ALL}設置了級聯 //mappedBy="stu"設置維護關系的控制權交給StuCard類這一方,相當於Student.hbm.xml中配置的inverse="true" @OneToOne(mappedBy="stu",cascade={CascadeType.ALL}) private StuCard sCard; public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public StuCard getsCard() { return sCard; } public void setsCard(StuCard sCard) { this.sCard = sCard; } }
StuCard.java

package cn.zhang.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; //學生證實體類 @Entity @Table(name="StuCard2161") public class StuCard { @Id //主鍵 @Column(length=18) //可以指定最大長度 private String cid;//身份證 @OneToOne //配置一對一關聯 @JoinColumn(name="sid")//指定了維護關系的外鍵字段是Student的sid private Student stu; public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public Student getStu() { return stu; } public void setStu(Student stu) { this.stu = stu; } }
最后只需要在hibernate.cfg.xml文件里面將該實體類加進去即可:
<!-- 注解配置 --> <mapping class="cn.zhang.entity.Student"/> <mapping class="cn.zhang.entity.StuCard"/>
測試:

package cn.zhang.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.After; import org.junit.Before; import org.junit.Test; import cn.zhang.entity.StuCard; import cn.zhang.entity.Student; import cn.zhang.util.HibernateUtil; public class MyTest { Session session; Transaction tx; //單元測試前走 @Before public void Before(){ session= HibernateUtil.currentSession(); tx= session.beginTransaction(); } //單元測試后走 @After public void After(){ tx.commit(); HibernateUtil.closeSession(); } @Test public void TestOne(){ Student student=new Student(); student.setName("good"); StuCard sCard=new StuCard(); sCard.setCid("11111111111111"); sCard.setStu(student); student.setsCard(sCard); session.save(student); } }
2.注解配置對象關聯關系之 多對一(部門和員工)
Dept.java

package cn.zhang.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.OneToMany; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; //部門實體類 @Entity @Table(name="Dept2161") public class Dept { @Id //主鍵生成策略 @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen") @SequenceGenerator(name="seq_gen",sequenceName="SEQ_HouseNum",allocationSize=1,initialValue=1) private Integer deptid; private String deptname; @OneToMany(mappedBy="dept",cascade={CascadeType.ALL}) @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 getDeptid() { return deptid; } public void setDeptid(Integer deptid) { this.deptid = deptid; } public String getDeptname() { return deptname; } public void setDeptname(String deptname) { this.deptname = deptname; } }
Emp.java

package cn.zhang.entity; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; //員工實體類 @Entity @Table(name="Emp2161") public class Emp { @Id //主鍵生成策略 @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen") @SequenceGenerator(name="seq_gen",sequenceName="SEQ_HouseNum",allocationSize=1,initialValue=1) private Integer empno; private String empname; @ManyToOne(fetch=FetchType.LAZY) //fentch: 設置了延遲加載 ,默認為立即加載,不設置則會和dept表外連接查詢 @JoinColumn(name="deptid") private Dept dept;//所屬部門 public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } 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; } }
最后只需要在hibernate.cfg.xml文件里面將該實體類加進去即可:
<!-- 注解配置 --> <mapping class="cn.zhang.entity.Dept"/> <mapping class="cn.zhang.entity.Emp"/>
測試:

package cn.zhang.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.After; import org.junit.Before; import org.junit.Test; import cn.zhang.entity.Dept; import cn.zhang.entity.Emp; import cn.zhang.util.HibernateUtil; public class MyTest { Session session; Transaction tx; //單元測試前走 @Before public void Before(){ session= HibernateUtil.currentSession(); tx= session.beginTransaction(); } //單元測試后走 @After public void After(){ tx.commit(); HibernateUtil.closeSession(); } @Test public void TestOne(){ Emp emp=new Emp(); emp.setEmpname("好人一個"); Dept dept=new Dept(); dept.setDeptname("人才部"); dept.getEmps().add(emp); emp.setDept(dept); session.save(dept); } @Test public void TestTwo(){ Emp emp = (Emp)session.load(Emp.class, 2); System.out.println(emp.getEmpname()); System.out.println("------------"); Dept dept = (Dept)session.load(Dept.class, 1); System.out.println(dept.getDeptname()); } }
3.注解配置對象關聯關系之 多對多(項目和員工)
Emp.java

package cn.zhang.entity; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; @Entity @Table(name = "Emp2161") public class Emp { @Id @GeneratedValue private Integer eid; private String name; @ManyToMany(cascade=CascadeType.ALL)//設置多對多和級聯 //利用第三張表實現多對多的關聯 @JoinTable( name = "EmpPro2161", //指定第三張表名 joinColumns = @JoinColumn(name = "eid"), //Emp表在第三張表中的外鍵 inverseJoinColumns = @JoinColumn(name = "pid")//Project表在第三張表中的外鍵 ) private Set<Project> projects = new HashSet<Project>(); public Integer getEid() { return eid; } public void setEid(Integer eid) { this.eid = eid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Project> getProjects() { return projects; } public void setProjects(Set<Project> projects) { this.projects = projects; } }
Project.java

package cn.zhang.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="Project2161") public class Project { @Id @GeneratedValue private Integer pid; private String name; @ManyToMany(mappedBy="projects")//設置多對多並指定維護關系的控制權交給Emp類這一方 private Set<Emp> emps=new HashSet<Emp>(); public Integer getPid() { return pid; } public void setPid(Integer pid) { this.pid = pid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Emp> getEmps() { return emps; } public void setEmps(Set<Emp> emps) { this.emps = emps; } }
最后只需要在hibernate.cfg.xml文件里面將該實體類加進去即可:
<!-- 注解配置 --> <mapping class="cn.zhang.entity.Project"/> <mapping class="cn.zhang.entity.Emp"/>
測試:

package cn.zhang.test; import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.After; import org.junit.Before; import org.junit.Test; import cn.zhang.entity.Emp; import cn.zhang.entity.Project; import cn.zhang.util.HibernateUtil; public class MyTest { Session session; Transaction tx; //單元測試前走 @Before public void Before(){ session= HibernateUtil.currentSession(); tx= session.beginTransaction(); } //單元測試后走 @After public void After(){ tx.commit(); HibernateUtil.closeSession(); } @Test public void TestOne(){ Emp emp=new Emp(); emp.setName("好人一個"); Project project=new Project(); project.setName("好項目"); project.getEmps().add(emp); emp.getProjects().add(project); session.save(emp); } }
注意:在判斷到底是誰維護關聯關系時,可以通過查看外鍵,哪個實體類定義了外鍵,哪個類就負責維護關聯關系。