Hibernate框架之註解的配置

在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

1.註解配置對象關聯關係之   一對一(學生對學生證)

 

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;
    }

}
View Code

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;
    }

}
View Code

最後只須要在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);
        
    }        
}
View Code

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;
    }

}
View Code

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;
    }

}
View Code

最後只須要在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());
        
    }

}
View Code

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;
    }

}
View Code

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;
    }

}
View Code

最後只須要在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);        
        
    }
}
View Code

 

注意:在判斷究竟是誰維護關聯關係時,能夠經過查看外鍵,哪一個實體類定義了外鍵,哪一個類就負責維護關聯關係。

相關文章
相關標籤/搜索