zoukankan      html  css  js  c++  java
  • 2.2、Hibernate用注解方式实现一对多、多对多关系

    一、一对多关系

      1、在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar

      2、新建一个com.st.bean4 包,往包里面添加两个含有注解的类:

        a)、DeptBean2类:

     1 package com.st.bean4;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 
     7 import javax.persistence.Column;
     8 import javax.persistence.Entity;
     9 import javax.persistence.GeneratedValue;
    10 import javax.persistence.Id;
    11 import javax.persistence.JoinColumn;
    12 import javax.persistence.OneToMany;
    13 import javax.persistence.Table;
    14 
    15 import org.hibernate.annotations.Cascade;
    16 import org.hibernate.annotations.CascadeType;
    17 import org.hibernate.annotations.GenericGenerator;
    18 
    19 @Entity                                               //指定实体类
    20 @Table(name="DEPT")                                   //对应表的名称
    21 @GenericGenerator(name="genID", strategy="increment") //声明主键生成策略
    22 public class DeptBean2 {
    23     @Id                                               //指定主键
    24     @GeneratedValue(generator="genID")                //设定主键生成策略
    25     @Column(name="ID")                                //指定类中的属性与表中的列的对应关系
    26     private long id;
    27     @Column(name="NAME")                              //指定类中的属性与表中的列的对应关系
    28     private String name;
    29     
    30     @OneToMany                                          //指定一对多关系
    31     @Cascade(value={CascadeType.SAVE_UPDATE})         //设定级联关系
    32     @JoinColumn(name="dept_id")                       //指定与本类主键所对应的外表的外键
    33     private Set<EmployeeBean2> emp = new HashSet<EmployeeBean2>();
    34     @Override
    35     public String toString() {
    36         return "DeptBean [id=" + id + ", name=" + name +"]";
    37     }
    38     public long getId() {
    39         return id;
    40     }
    41     public void setId(long id) {
    42         this.id = id;
    43     }
    44     public String getName() {
    45         return name;
    46     }
    47     public void setName(String name) {
    48         this.name = name;
    49     }
    50     public Set<EmployeeBean2> getEmp() {
    51         return emp;
    52     }
    53     public void setEmp(Set<EmployeeBean2> emp) {
    54         this.emp = emp;
    55     }
    56 }

        b)、EmployeeBean类:

     1 package com.st.bean4;
     2 
     3 import javax.persistence.Column;
     4 import javax.persistence.Entity;
     5 import javax.persistence.GeneratedValue;
     6 import javax.persistence.Id;
     7 import javax.persistence.JoinColumn;
     8 import javax.persistence.ManyToOne;
     9 import javax.persistence.Table;
    10 
    11 import org.hibernate.annotations.GenericGenerator;
    12 
    13 @Entity   //指定一个实体
    14 @Table(name="employee")   //指定表的名称
    15 @GenericGenerator(name="genID", strategy="increment") //声明主键生成策略
    16 public class EmployeeBean2 {
    17     @Id                                               //指定主键
    18     @GeneratedValue(generator="genID")                //设定主键生成策略
    19     @Column(name="ID")                                //类中的属性和表中的列名的对应关系
    20     private long id;
    21     @Column(name="NAME")
    22     private String name;
    23     @Column(name="SEX")
    24     private String sex;
    25     @Column(name="JOB")
    26     private String job;
    27     @ManyToOne// 指定多对一关系                       //指定多对一关系
    28     @JoinColumn(name="DEPT_ID")                       
    29     //一个员工对应于一个部门号,所以这里不用集合
    30     private DeptBean2 dept ;                          //注意这个地方不要new对象,否则会无法运行 
    31     public long getId() {
    32         return id;
    33     }
    34     public void setId(long id) {
    35         this.id = id;
    36     }
    37     public String getName() {
    38         return name;
    39     }
    40     public void setName(String name) {
    41         this.name = name;
    42     }
    43     public String getSex() {
    44         return sex;
    45     }
    46     public void setSex(String sex) {
    47         this.sex = sex;
    48     }
    49     public String getJob() {
    50         return job;
    51     }
    52     public void setJob(String job) {
    53         this.job = job;
    54     }
    55     public DeptBean2 getDept() {
    56         return dept;
    57     }
    58     public void setDept(DeptBean2 dept) {
    59         this.dept = dept;
    60     }
    61     @Override
    62     public String toString() {
    63         return "EmployeeBean [id=" + id + ", name=" + name + ", sex=" + sex
    64                 + ", job=" + job + ", dept=" + dept
    65                 + "]";
    66     }
    67 }

      3、在hibernate.cfg.xml文件中引入上面两个类的映射

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

      4、在BeanTest中添加相应的测试方法:

     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     }

     

    二、多对多关系

      1、新建一个com.st.bean4 包,往包里面添加两个含有注解的类

        a)、UserBean2:

     1 package com.st.bean5;
     2 import java.util.HashSet;
     3 import java.util.Set;
     4 
     5 import javax.persistence.Column;
     6 import javax.persistence.Entity;
     7 import javax.persistence.GeneratedValue;
     8 import javax.persistence.Id;
     9 import javax.persistence.JoinColumn;
    10 import javax.persistence.JoinTable;
    11 import javax.persistence.ManyToMany;
    12 import javax.persistence.Table;
    13 
    14 import org.hibernate.annotations.Cascade;
    15 import org.hibernate.annotations.CascadeType;
    16 import org.hibernate.annotations.GenericGenerator;
    17 
    18 @Entity                                                //实体
    19 @Table(name="T_USER")                                  //表名
    20 @GenericGenerator(name="genID", strategy="increment")  //声明主键生成策略
    21 public class UserBean2 {
    22     @Id                                                //指定主键
    23     @GeneratedValue(generator="genID")                 //设定主键生成策略
    24     @Column(name="ID")                                 //指定类的属性和表的字段的对应关系
    25     private long id;
    26     @Column(name="NAME")
    27     private String name;
    28     @Column(name="SEX")
    29     private String sex;
    30     @ManyToMany                                        //指定多对多关系
    31     @Cascade(value={CascadeType.SAVE_UPDATE})          //设置级联关系
    32     @JoinTable(name="USER_ROLE",                       //指定第三张表
    33                 joinColumns={@JoinColumn(name="USER_ID")},             //本表与中间表的外键对应
    34                     inverseJoinColumns={@JoinColumn(name="ROLE_ID")})  //另一张表与第三张表的外键的对应关系
    35     private Set<RoleBean2> role = new HashSet<RoleBean2>();
    36     public long getId() {
    37         return id;
    38     }
    39     public void setId(long id) {
    40         this.id = id;
    41     }
    42     public String getName() {
    43         return name;
    44     }
    45     public void setName(String name) {
    46         this.name = name;
    47     }
    48     public String getSex() {
    49         return sex;
    50     }
    51     public void setSex(String sex) {
    52         this.sex = sex;
    53     }
    54     public Set<RoleBean2> getRole() {
    55         return role;
    56     }
    57     public void setRole(Set<RoleBean2> role) {
    58         this.role = role;
    59     }
    60     @Override
    61     public String toString() {
    62         return "UserBean [id=" + id + ", name=" + name + ", sex=" + sex
    63                 + ", role=" + role + "]";
    64     }
    65 }

        b)、RoleBean类:

     1 package com.st.bean5;
     2 import java.util.HashSet;
     3 
     4 import java.util.Set;
     5 
     6 import javax.persistence.Column;
     7 import javax.persistence.Entity;
     8 import javax.persistence.GeneratedValue;
     9 import javax.persistence.Id;
    10 import javax.persistence.JoinColumn;
    11 import javax.persistence.JoinTable;
    12 import javax.persistence.ManyToMany;
    13 import javax.persistence.Table;
    14 
    15 import org.hibernate.annotations.Cascade;
    16 import org.hibernate.annotations.CascadeType;
    17 import org.hibernate.annotations.GenericGenerator;
    18 
    19 @Entity                                              //实体
    20 @Table(name="T_ROLE")                                //表名
    21 @GenericGenerator(name="genID", strategy="increment")//声明主键生成策略
    22 public class RoleBean2 {
    23     @Id                                              //主键
    24     @GeneratedValue(generator="genID")               //设置主键生成策略
    25     @Column(name="ID")                                 //类中的属性与表的字段的对应关系
    26     private long id;
    27     @Column(name="POST")
    28     private String post;//职位
    29     @Column(name="PAY")
    30     private int pay;    //薪资
    31     @ManyToMany                                      //多对多关系  
    32     @Cascade(value={CascadeType.SAVE_UPDATE})        //级联关系
    33     @JoinTable(name="USER_ROLE",                     //中间表的名称
    34                 joinColumns={@JoinColumn(name="ROLE_ID")},   //本表与中间表的外键对应关系
    35                     inverseJoinColumns={@JoinColumn(name="USER_ID")}) //另一张表与中间表的外键的对应关系
    36     private Set<UserBean2>  user = new HashSet<UserBean2>();
    37 
    38     public long getId() {
    39         return id;
    40     }
    41     public void setId(long id) {
    42         this.id = id;
    43     }
    44     public String getPost() {
    45         return post;
    46     }
    47     public void setPost(String post) {
    48         this.post = post;
    49     }
    50     public int getPay() {
    51         return pay;
    52     }
    53     public void setPay(int pay) {
    54         this.pay = pay;
    55     }
    56     public Set<UserBean2> getUser() {
    57         return user;
    58     }
    59     public void setUser(Set<UserBean2> user) {
    60         this.user = user;
    61     }
    62     @Override
    63     public String toString() {
    64         return "RoleBean [id=" + id + ", post=" + post + ", pay=" + pay + "]";
    65     }
    66 }

      2、在hibernate.cfg.xml中引入UserBean2和RoleBean2这两个类的映射:

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

      3、在BeanTest类中添加测试方法:

     1     @Test
     2     public void bean5test1(){
     3         // 获取一个会话
     4         Session session = HibernateTools.openSession();
     5         //开启一次事物
     6         Transaction tran = session.beginTransaction();
     7         UserBean2 user = new UserBean2();
     8 //        RoleBean2 role = (RoleBean2) session.get(RoleBean2.class,1L);
     9         RoleBean2 role = new RoleBean2();
    10         
    11         user.setName("汪文仕");
    12         user.setSex("男");
    13         
    14         role.setPost("博士");
    15         role.setPay(10000);
    16         
    17         role.getUser().add(user);
    18         session.save(role);
    19         //确认提交事物
    20         tran.commit();
    21     }
    22     @Test
    23     public void bean5test2(){
    24         // 获取一个会话
    25         Session session = HibernateTools.openSession();
    26 /*        List<UserBean> list = session.createCriteria(UserBean.class).list();
    27         for(UserBean user : list)
    28             System.out.println(user);*/
    29         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";
    30         List<Map<String,Object>> list = session.createQuery(hql).list();
    31         for(Map<String,Object> data : list)
    32             System.out.println(data);
    33     }

     三、注意:

      1、引入了注解需要的jar包后要先删除Java EE 5 Library这个库,否则会两个jar包中的类产生冲突

      2、在多表操作时最好设置级联关系,不然对表操作时要先读取一个类的数据,再将新建的一个类的数据添加到这个类上才成功对三张表同时操作。

  • 相关阅读:
    大约 C++ 几个方面分析--overload, override, overwrite, rewrite
    Catalan数总结
    JAVA该队列中的数组,圆阵队列,链队列
    hdu4770:Lights Against Dudely(回溯 + 修剪)
    Birt
    Activity
    简单实现的Servlet文件上传,并显示
    阿里云centos 6.5 32位安装可视化界面的方法
    cannot mount database in EXCLUSIVE mode
    ORA-00845: MEMORY_TARGET not supported on this system
  • 原文地址:https://www.cnblogs.com/czj-zhm/p/5884715.html
Copyright © 2011-2022 走看看