如何使用hibernate 註解開發實現 一對多、多對多的關係

一對一
package com.st.bean4;

import java.util.HashSet;
import java.util.Set;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;

@Entity                                               //指定實體類
@Table(name="DEPT")                                   //對應表的名稱
@GenericGenerator(name="genID", strategy="increment") //聲明主鍵生成策略
public class DeptBean2 {
    @Id                                               //指定主鍵
    @GeneratedValue(generator="genID")                //設定主鍵生成策略
    @Column(name="ID")                                //指定類中的屬性與表中的列的對應關係
    private long id;
    @Column(name="NAME")                              //指定類中的屬性與表中的列的對應關係
    private String name;
    
    @OneToMany                                          //指定一對多關係
    @Cascade(value={CascadeType.SAVE_UPDATE})         //設定級聯關係
    @JoinColumn(name="dept_id")                       //指定與本類主鍵所對應的外表的外鍵
    private Set<EmployeeBean2> emp = new HashSet<EmployeeBean2>();
    @Override
    public String toString() {
        return "DeptBean [id=" + id + ", name=" + name +"]";
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set<EmployeeBean2> getEmp() {
        return emp;
    }
    public void setEmp(Set<EmployeeBean2> emp) {
        this.emp = emp;
    }
}

//實體類創建

package com.st.bean4;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity   //指定一個實體
@Table(name="employee")   //指定表的名稱
@GenericGenerator(name="genID", strategy="increment") //聲明主鍵生成策略
public class EmployeeBean2 {
    @Id                                               //指定主鍵
    @GeneratedValue(generator="genID")                //設定主鍵生成策略
    @Column(name="ID")                                //類中的屬性和表中的列名的對應關係
    private long id;
    @Column(name="NAME")
    private String name;
    @Column(name="SEX")
    private String sex;
    @Column(name="JOB")
    private String job;
    @ManyToOne// 指定多對一關係                       //指定多對一關係
    @JoinColumn(name="DEPT_ID")                       
    //一個員工對應於一個部門號,所以這裏不用集合
    private DeptBean2 dept ;                          //注意這個地方不要new對象,否則會無法運行 
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getJob() {
        return job;
    }
    public void setJob(String job) {
        this.job = job;
    }
    public DeptBean2 getDept() {
        return dept;
    }
    public void setDept(DeptBean2 dept) {
        this.dept = dept;
    }
    @Override
    public String toString() {
        return "EmployeeBean [id=" + id + ", name=" + name + ", sex=" + sex
                + ", job=" + job + ", dept=" + dept
                + "]";
    }
}

//添加配置文件

1          <mapping class="com.st.bean5.UserBean2" />
2          <mapping class="com.st.bean5.RoleBean2" />

//創建測試類

 1     @Test
 2     public void bean4test1(){
 3         Session session = HibernateTools.openSession();
 4         Transaction tran = session.beginTransaction();
 5         //首先在dept中新增一條數據,再關聯的在employee中新增一條數據
 6         //DeptBean2 dept = new DeptBean2();
 7         //先讀去dept中的數據,再在讀取的基礎上關聯的在employee中新增一條數據
 8         DeptBean2 dept = (DeptBean2) session.get(DeptBean2.class,1L); //1L代表主鍵
 9         EmployeeBean2 emp = new EmployeeBean2();
10         //dept.setName("技術部");
11         emp.setName("陳澤俊");
12         emp.setSex("男");
13         emp.setJob("STM32");
14         dept.getEmp().add(emp);
15         session.save(dept);
16         //確認提交事物
17         tran.commit();
18     }

//多對多關係

package com.st.bean5;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
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;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;

@Entity                                                //實體
@Table(name="T_USER")                                  //表名
@GenericGenerator(name="genID", strategy="increment")  //聲明主鍵生成策略
public class UserBean2 {
    @Id                                                //指定主鍵
    @GeneratedValue(generator="genID")                 //設定主鍵生成策略
    @Column(name="ID")                                 //指定類的屬性和表的字段的對應關係
    private long id;
    @Column(name="NAME")
    private String name;
    @Column(name="SEX")
    private String sex;
    @ManyToMany                                        //指定多對多關係
    @Cascade(value={CascadeType.SAVE_UPDATE})          //設置級聯關係
    @JoinTable(name="USER_ROLE",                       //指定第三張表
                joinColumns={@JoinColumn(name="USER_ID")},             //本表與中間表的外鍵對應
                    inverseJoinColumns={@JoinColumn(name="ROLE_ID")})  //另一張表與第三張表的外鍵的對應關係
    private Set<RoleBean2> role = new HashSet<RoleBean2>();
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Set<RoleBean2> getRole() {
        return role;
    }
    public void setRole(Set<RoleBean2> role) {
        this.role = role;
    }
    @Override
    public String toString() {
        return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex
                + ", role=" + role + "]";
    }
}

//加載關係映射

1          <mapping class="com.st.bean5.UserBean2" />
2          <mapping class="com.st.bean5.RoleBean2" />

//添加測試類

@Test
    public void bean5test1(){
        // 獲取一個會話
        Session session = HibernateTools.openSession();
        //開啓一次事物
        Transaction tran = session.beginTransaction();
        UserBean2 user = new UserBean2();
//        RoleBean2 role = (RoleBean2) session.get(RoleBean2.class,1L);
        RoleBean2 role = new RoleBean2();
        
        user.setName("蒼姐姐");
        user.setSex("女");
        
        role.setPost("博士");
        role.setPay(10000);
        
        role.getUser().add(user);
        session.save(role);
        //確認提交事物
        tran.commit();
    }
    @Test
    public void bean5test2(){
        // 獲取一個會話
        Session session = HibernateTools.openSession();
/*        List<UserBean> list = session.createCriteria(UserBean.class).list();
        for(UserBean user : list)
            System.out.println(user);*/
        String hql = "select new Map(u.name as name,u.sex as sex,r.post as post,r.pay as pay) from UserBean2 u join u.role r";
        List<Map<String,Object>> list = session.createQuery(hql).list();
        for(Map<String,Object> data : list)
            System.out.println(data);
    }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章