在上一次的注解案例里面配置注解的同时,也添加了一对多(@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级联关系,并设置了两表之间相关联的第三表的表名及列名。
注解的配置及测试信息留笔以待后续关注。