在hibernate中,一般配置對象關係映射關係有兩種,一種是基於xml的方式,另外一種是基於annotation的註解方式,熟話說,蘿蔔青菜,可有所愛,每一個人都有本身喜歡的配置方式,我在試了這兩種方式之後,發現使用annotation的方式能夠更簡介,因此這裏就簡單記錄下經過annotation來配置各類映射關係,在hibernate4之後已經將annotation的jar包集成進來了,若是使用hibernate3的版本就須要引入annotation的jar包。java
配置持久化類經常使用的註解:數據庫
注:GeneratedValue指定了標識符的生成策略。jpa提供了4種標準用法。session
01.AUTO:根據不一樣的數據庫選擇不一樣的策略app
02.TABLE:使用表保存id值ide
03.INDENITY:使用數據庫自動生成主鍵單元測試
04.SEQUENCE:使用序列建立主鍵(如Oracle)測試
配置關聯關係經常使用的註解:fetch
話很少說了,待你們來看看到底怎麼用的才最重要this
Student.javaspa
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); } }
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()); } }
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); } }
注意:在判斷究竟是誰維護關聯關係時,能夠經過查看外鍵,哪一個實體類定義了外鍵,哪一個類就負責維護關聯關係。