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级联关系,并设置了两表之间相关联的第三表的表名及列名。

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

  

原文地址:https://www.cnblogs.com/john69-/p/5799527.html