zoukankan      html  css  js  c++  java
  • Java_注解之二

    在上一次的注解案例里面配置注解的同时,也添加了一对多(@OneToMany)的关系在里面。

    本次将补充上次的缺失:其他三种关联方式的配置。

    为了简化配置的复杂度   在此案例中Emp和Dept并不是唯一的两个类,其他的我都会在适当的时机点明。

    例如配置一对一关联的时候再来使用这两个类就不太合适了  。

    @OneToOne的配置    参与的类有Student和Card(学生与身份证是一对一的关系)

      Student

     1 package cn.happy.entity;
     2 
     3 import javax.persistence.Column;
     4 import javax.persistence.Entity;
     5 import javax.persistence.Id;
     6 import javax.persistence.OneToOne;
     7 import javax.persistence.Table;
     8 @Entity
     9 @Table(name="Card")
    10 public class IdCard {
    11     @Id
    12     @Column(length=18)
    13    private  String cid;
    14     @Column(name="cname")
    15    private String cname;
    16     @OneToOne(mappedBy="craid")
    17    private Student stu;
    18 }

      Card

     1 package cn.happy.entity;
     2 
     3 import javax.persistence.CascadeType;
     4 import javax.persistence.Column;
     5 import javax.persistence.Entity;
     6 import javax.persistence.GeneratedValue;
     7 import javax.persistence.Id;
     8 import javax.persistence.JoinColumn;
     9 import javax.persistence.OneToOne;
    10 import javax.persistence.Table;
    11 
    12 import org.hibernate.annotations.CollectionId;
    13 @Entity
    14 @Table(name="Student")
    15 public class Student {
    16     @Id
    17     @GeneratedValue
    18     private Integer id;
    19     @Column(name="name")
    20     private String name;
    21     @OneToOne(cascade={CascadeType.ALL})
    22     @JoinColumn(name="cid")
    23     private Card card;
    24 
    25 }

    @ManyToOne的配置   Emp和Dept(符合多对一的关系)

      Emp

     1 @Entity
     2 @Table (name="EMP")
      //注解的命名查询
    3 @NamedQuery(name="selectEmp",query="from Emp e where e.empId>:eno") 4 public class Emp { 5 @Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen") 6 @SequenceGenerator(name="seq_gen",sequenceName="SEQ_Num",allocationSize=1,initialValue=4) 7 @Column (name="EMPNO") 8 private Integer empId; 9 @Column (name="ENAME") 10 private String empName; 11 @Column 12 private String job; 13 @Column 14 private String mgr; 15 @Column 16 private Date hiredate; 17 @Column 18 private Integer sal; 19 @Column 20 private Integer comm; 21 @OneToMany(mappedBy=“emp”)23 private Dept dept; 24 }

      Dept

     1 /**
     2  * 注解1.1
     3  */
     4 @Entity 
     5 @Table(name="DEPT")
     6 public class Dept {
     7     
     8     /*@Id @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_gen")
     9     @SequenceGenerator(name="seq_gen",sequenceName="HIBERNATE_SEQUENCE",allocationSize=1,initialValue=4)*/
    10     
    11     @Id
    12     //主键生成策略
    13     @GeneratedValue(generator="my_gen")
    14     //自定义主键生成方式:uuid   
    15     @GenericGenerator(name="my_gen",strategy="uuid")
    16     private Integer deptNo;
    17     
    18     @Column(name="DNAME")
    19     private String deptName;
    20     
    21     @Column(name="LOC")
    22     private String loc;
    23     
    24     @ManyToOne(fetch=FetchType.LAZY)
         @JoinColumn(name="DEPTNO")
    25 private Set<Emp> emps = new HashSet<Emp>();

    @ManyToMany的配置   Emp和Project(符合多对多的关系)

      Project

     1 /**
     2  * 注解1.1
     3  */
     4 @Entity
     5 @Table(name="AnProject")
     6 public class Project {
     7     @Id
     8     @GeneratedValue
     9     private Integer pid;
    10     private String pname;
    11 
    12     @ManyToMany(mappedBy="pros")
    13     private Set<Emp> emp = new HashSet<Emp>();
    14 }

      Emp

     1 /**
     2  * 注解1.2
     3  */
     4 @Entity
     5 @Table(name="AnEmp")
     6 public class Emp {
     7     @Id
     8     @GeneratedValue
     9    private Integer empId;
    10     
    11    private String empName;    
    12     
    13     @ManyToMany(cascade=CascadeType.ALL)
    14     //指定两表相关联的中间表    只有两列(eid,pid)
    15     @JoinTable(
    16             name="AnnoEmpPro",
    17             joinColumns=@JoinColumn(name="eid"),
    18             inverseJoinColumns=@JoinColumn(name="pid")
    19     )
    20    private Set<Project> pros = new HashSet<Project>();
    21 }

      测试  多对多

     1     @Test
     2     public void Test1(){
     3         Session session = HibernateUtils.currentSession();
     4         Transaction tx = session.beginTransaction();
     5         //创建两个员工对象
     6         Emp emp1 = new Emp("zym1");
     7         Emp emp2 = new Emp("zym2");
     8         
     9         //创建两个项目对象
    10         Project pro1 = new Project("项目1");
    11         Project pro2 = new Project("项目2");
    12         //1号员工分别参加了 项目1 和项目2
    13         emp1.getPros().add(pro1);
    14         emp1.getPros().add(pro2);
    15         
    16         //2号员工只参与了项目2
    17         emp2.getPros().add(pro2);
    18         session.save(emp1);
    19         session.save(emp2);
    20 
    21         tx.commit();
    22         HibernateUtils.closeSession();
    23     }

    可以看到 :  分别给emp表添加了2条数据、给project表添加了2条数据、给emppro中间表添加了4条记录

    在上面的双向多对多的配置中,我们选择了Emp作为了主表,所以在Emp中设置了cascade级联关系,并设置了两表之间相关联的第三表的表名及列名。

     注解的配置及测试信息留笔以待后续关注。

      

  • 相关阅读:
    华为面向开发者的十大技术
    为什么开发者应该摒弃敏捷?
    程序员创业的特别之处
    这是我的facebook和twitter,欢迎大家来加我
    教程:2014新版新浪博客如何添加音乐播放器?
    Algs4-1.1.11编写一段代码,打印出一个二维布尔数组的内容
    Algs4-1.1.9十进制整数转二进制
    Algs4-1.1.8下列语句会打印出什么结果?给出解释
    Algs4-1.1.7分别给出以下代码段打印的值
    Algs4-1.1.6下面这段程序会打印出什么
  • 原文地址:https://www.cnblogs.com/john69-/p/5799527.html
Copyright © 2011-2022 走看看