Hibernate(四)

注解高级(原文再续书接上一回)

6.单向关联

即单向配置注解关联信息

  单向关联的数据库生成的表与双向关联生成的表是相同的,只是在查询的时候不同。双向是双方都可以查询各自的信息,而单向只有加了注解的表可以查询另一方的信息!!!一对多以及多对一是同一概念,只是参考系不一样。一般会由多的一端来维护生成外键,这样效率更高;而作为一的那端也可以作为维护生成外键,但是效率普遍较低,一般不推荐使用。需要用哪种关联,归根到底还是要看实际业务需求。

A.一对一

 主表不需要配置注解信息,而从表需要

 1 package com.rong.entity;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.GenerationType;
 6 import javax.persistence.Id;
 7 import javax.persistence.Table;
 8 
 9 @Entity
10 @Table(name="t_citizen")
11 public class Citizen {
12     @Id
13     @GeneratedValue(strategy=GenerationType.AUTO)
14     private int id;
15     private String name;
16     private int sex; 
17     public int getId() {
18         return id;
19     }
20     public void setId(int id) {
21         this.id = id;
22     }
23     public String getName() {
24         return name;
25     }
26     public void setName(String name) {
27         this.name = name;
28     }
29     public int getSex() {
30         return sex;
31     }
32     public void setSex(int sex) {
33         this.sex = sex;
34     }
35     @Override
36     public String toString() {
37         return "Citizen [id=" + id + ", name=" + name + ", sex=" + sex + "]";
38     }
39 }
 1 package com.rong.entity;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.FetchType;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.JoinColumn;
 9 import javax.persistence.OneToOne;
10 import javax.persistence.Table;
11 
12 @Entity
13 @Table(name="t_idcard")
14 public class IDcard {
15     @Id
16     @GeneratedValue(strategy=GenerationType.AUTO)
17     private int cardid;
18     private String name;
19     private String addr;
20     @OneToOne(targetEntity=Citizen.class,fetch=FetchType.LAZY) // 维护关联关系(从表)
21     @JoinColumn(name="t_id",referencedColumnName="id",unique=true)//生成外键列,参考citizen的id
22     private Citizen citizen;
23     public int getCardid() {
24         return cardid;
25     }
26     public void setCardid(int cardid) {
27         this.cardid = cardid;
28     }
29     public String getName() {
30         return name;
31     }
32     public void setName(String name) {
33         this.name = name;
34     }
35     public String getAddr() {
36         return addr;
37     }
38     public void setAddr(String addr) {
39         this.addr = addr;
40     }
41     public Citizen getCitizen() {
42         return citizen;
43     }
44     public void setCitizen(Citizen citizen) {
45         this.citizen = citizen;
46     }
47     @Override
48     public String toString() {
49         return "IDcard [cardid=" + cardid + ", name=" + name + ", addr=" + addr + ", citizen=" + citizen + "]";
50     }
51 }
 1 package com.rong.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.Transaction;
 6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 7 import org.hibernate.cfg.Configuration;
 8 import org.hibernate.service.ServiceRegistry;
 9 import org.junit.Test;
10 
11 import com.rong.entity.Citizen;
12 import com.rong.entity.IDcard;
13 
14 public class HibernateTest {
15     @Test
16     public void test1(){
17         Configuration configuration=new Configuration().configure();
18         ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
19         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
20         Session session = sessionFactory.openSession();
21         Transaction transaction = session.beginTransaction();
22 
23         Citizen citizen=new Citizen();
24         citizen.setName("rjl");
25         citizen.setSex(0);
26         IDcard iDcard=new IDcard();
27         iDcard.setName("rjl");
28         iDcard.setAddr("中国");
29         iDcard.setCitizen(citizen);
30         
31         session.save(citizen);
32         session.save(iDcard);
33         //查询
34         Citizen findCitizen=(Citizen) session.get(Citizen.class, 1);
35         //单向关联中主表查不到另一端的数据信息,只能查找自身信息
36         System.out.println(findCitizen.getId()+":"+findCitizen.getName());
37         IDcard findIDcard=(IDcard)session.get(IDcard.class, 1);
38         //单向关联中从表不仅能查找自身信息,还可以查到另一端的数据信息
39         System.out.println(findIDcard.getCardid()+":"+findIDcard.getAddr()+findIDcard.getCitizen());
40         transaction.commit();
41         session.close();
42         sessionFactory.close();
43     }
44 }

B.一对多

 1 package com.rong.entity;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Entity;
 8 import javax.persistence.FetchType;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.OneToMany;
14 import javax.persistence.Table;
15 
16 @Entity
17 @Table(name="t_teacher")
18 public class Teacher {
19     @Id
20     @GeneratedValue(strategy=GenerationType.AUTO)
21     private int tid;
22     private String tname;
23     //一的一端
24     @OneToMany(targetEntity=Student.class
25             ,fetch=FetchType.LAZY
26             ,cascade=CascadeType.REMOVE
27             ,orphanRemoval=true)
28     @JoinColumn(name="t_id",referencedColumnName="tid")
29     private Set<Student> stu=new HashSet<Student>();
30     public int getTid() {
31         return tid;
32     }
33     public void setTid(int tid) {
34         this.tid = tid;
35     }
36     public String getTname() {
37         return tname;
38     }
39     public void setTname(String tname) {
40         this.tname = tname;
41     }
42     public Set<Student> getStu() {
43         return stu;
44     }
45     public void setStu(Set<Student> stu) {
46         this.stu = stu;
47     }
48     @Override
49     public String toString() {
50         return "Teacher [tid=" + tid + ", tname=" + tname + ", stu=" + stu + "]";
51     }
52 }
 1 package com.rong.entity;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.GenerationType;
 6 import javax.persistence.Id;
 7 import javax.persistence.Table;
 8 
 9 @Entity
10 @Table(name="t_student")
11 public class Student {
12     @Id
13     @GeneratedValue(strategy=GenerationType.AUTO)
14     private int sid;
15     private String sname;
16     public int getSid() {
17         return sid;
18     }
19     public void setSid(int sid) {
20         this.sid = sid;
21     }
22     public String getSname() {
23         return sname;
24     }
25     public void setSname(String sname) {
26         this.sname = sname;
27     }
28     @Override
29     public String toString() {
30         return "Student [sid=" + sid + ", sname=" + sname + "]";
31     }
32 }
 1 package com.rong.test;
 2 
 3 import java.util.Set;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.service.ServiceRegistry;
11 import org.junit.Test;
12 
13 import com.rong.entity.Citizen;
14 import com.rong.entity.IDcard;
15 import com.rong.entity.Student;
16 import com.rong.entity.Teacher;
17 
18 public class HibernateTest {
19     @Test
20     public void test1(){
21         Configuration configuration=new Configuration().configure();
22         ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
23         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
24         Session session = sessionFactory.openSession();
25         Transaction transaction = session.beginTransaction();
26 
27         Teacher teacher=new Teacher();
28         teacher.setTname("夏雨");
29         Student student1=new Student();
30         student1.setSname("曹操");
31         Student student2=new Student();
32         student2.setSname("刘备");
33         Set<Student> set = teacher.getStu();
34         set.add(student1);
35         set.add(student2);
36         session.save(student1);
37         session.save(student2);
38         session.save(teacher);
39         //
40         Student stu=(Student) session.get(Student.class, 1);
41         System.out.println(stu.getSid()+":"+stu.getSname());
42         
43         //
44         Teacher tea=(Teacher) session.get(Teacher.class, 1);
45         System.out.println(tea.getTname()+tea.getStu());
46         transaction.commit();
47         session.close();
48         sessionFactory.close();
49     }
50 }

C.多对一

 

 1 package com.rong.entity;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.GenerationType;
 6 import javax.persistence.Id;
 7 import javax.persistence.Table;
 8 
 9 @Entity
10 @Table(name="t_teacher")
11 public class Teacher {
12     @Id
13     @GeneratedValue(strategy=GenerationType.AUTO)
14     private int tid;
15     private String tname;
16     
17     public int getTid() {
18         return tid;
19     }
20     public void setTid(int tid) {
21         this.tid = tid;
22     }
23     public String getTname() {
24         return tname;
25     }
26     public void setTname(String tname) {
27         this.tname = tname;
28     }
29     @Override
30     public String toString() {
31         return "Teacher [tid=" + tid + ", tname=" + tname + "]";
32     }
33 }
 1 package com.rong.entity;
 2 
 3 import javax.persistence.CascadeType;
 4 import javax.persistence.Entity;
 5 import javax.persistence.FetchType;
 6 import javax.persistence.GeneratedValue;
 7 import javax.persistence.GenerationType;
 8 import javax.persistence.Id;
 9 import javax.persistence.JoinColumn;
10 import javax.persistence.ManyToOne;
11 import javax.persistence.Table;
12 
13 @Entity
14 @Table(name="t_student")
15 public class Student {
16     @Id
17     @GeneratedValue(strategy=GenerationType.AUTO)
18     private int sid;
19     private String sname;
20     //多的一端
21     @ManyToOne(targetEntity=Teacher.class
22                 ,fetch=FetchType.LAZY
23                 ,cascade=CascadeType.REMOVE
24                 )
25     @JoinColumn(name="t_id",referencedColumnName="tid")
26     private Teacher teach;
27     public int getSid() {
28         return sid;
29     }
30     public void setSid(int sid) {
31         this.sid = sid;
32     }
33     public String getSname() {
34         return sname;
35     }
36     public void setSname(String sname) {
37         this.sname = sname;
38     }
39     public Teacher getTeach() {
40         return teach;
41     }
42     public void setTeach(Teacher teach) {
43         this.teach = teach;
44     }
45     @Override
46     public String toString() {
47         return "Student [sid=" + sid + ", sname=" + sname + ", teach=" + teach + "]";
48     }
49 }
 1 package com.rong.test;
 2 
 3 import java.util.Set;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.service.ServiceRegistry;
11 import org.junit.Test;
12 
13 import com.rong.entity.Student;
14 import com.rong.entity.Teacher;
15 
16 public class HibernateTest {
17     @Test
18     public void test1(){
19         Configuration configuration=new Configuration().configure();
20         ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
21         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
22         Session session = sessionFactory.openSession();
23         Transaction transaction = session.beginTransaction();
24 
25         Teacher teacher=new Teacher();
26         teacher.setTname("夏雨");
27         Student student1=new Student();
28         student1.setSname("曹操");
29         student1.setTeach(teacher);
30         Student student2=new Student();
31         student2.setSname("刘备");
32         student2.setTeach(teacher);
33         session.save(teacher);
34         session.save(student1);
35         session.save(student2);
36         //
37         Student stu=(Student) session.get(Student.class, 2);
38         System.out.println(stu.getSname()+":"+stu.getTeach().getTname());
39         
40         //
41         Teacher tea=(Teacher) session.get(Teacher.class, 1);
42         System.out.println(tea.getTid()+tea.getTname());
43         transaction.commit();
44         session.close();
45         sessionFactory.close();
46     }
47 }

D.多对多

 1 package com.rong.entity;
 2 
 3 import javax.persistence.Entity;
 4 import javax.persistence.GeneratedValue;
 5 import javax.persistence.GenerationType;
 6 import javax.persistence.Id;
 7 import javax.persistence.Table;
 8 
 9 @Entity
10 @Table(name="t_teacher")
11 public class Teacher {
12     @Id
13     @GeneratedValue(strategy=GenerationType.AUTO)
14     private int tid;
15     private String tname;
16     
17     public int getTid() {
18         return tid;
19     }
20     public void setTid(int tid) {
21         this.tid = tid;
22     }
23     public String getTname() {
24         return tname;
25     }
26     public void setTname(String tname) {
27         this.tname = tname;
28     }
29     @Override
30     public String toString() {
31         return "Teacher [tid=" + tid + ", tname=" + tname + "]";
32     }
33 }
 1 package com.rong.entity;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Entity;
 8 import javax.persistence.FetchType;
 9 import javax.persistence.GeneratedValue;
10 import javax.persistence.GenerationType;
11 import javax.persistence.Id;
12 import javax.persistence.JoinColumn;
13 import javax.persistence.JoinTable;
14 import javax.persistence.ManyToMany;
15 import javax.persistence.Table;
16 
17 @Entity
18 @Table(name="t_student")
19 public class Student {
20     @Id
21     @GeneratedValue(strategy=GenerationType.AUTO)
22     private int sid;
23     private String sname;
24     @ManyToMany(targetEntity=Teacher.class
25             ,fetch=FetchType.LAZY
26             ,cascade=CascadeType.REMOVE)
27     // 生成中间表
28     @JoinTable(name="tea_stu"
29                 ,joinColumns=@JoinColumn(name="s_id",referencedColumnName="sid")
30                 ,inverseJoinColumns=@JoinColumn(name="t_id",referencedColumnName="tid")
31                 )
32     private Set<Teacher> teacherSet=new HashSet<Teacher>();
33     public int getSid() {
34         return sid;
35     }
36     public void setSid(int sid) {
37         this.sid = sid;
38     }
39     public String getSname() {
40         return sname;
41     }
42     public void setSname(String sname) {
43         this.sname = sname;
44     }
45     public Set<Teacher> getTeacherSet() {
46         return teacherSet;
47     }
48     public void setTeacherSet(Set<Teacher> teacherSet) {
49         this.teacherSet = teacherSet;
50     }
51     @Override
52     public String toString() {
53         return "Student [sid=" + sid + ", sname=" + sname + ", teacherSet=" + teacherSet + "]";
54     }
55 }
 1 package com.rong.test;
 2 
 3 import java.util.Set;
 4 
 5 import org.hibernate.Session;
 6 import org.hibernate.SessionFactory;
 7 import org.hibernate.Transaction;
 8 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 9 import org.hibernate.cfg.Configuration;
10 import org.hibernate.service.ServiceRegistry;
11 import org.junit.Test;
12 
13 import com.rong.entity.Student;
14 import com.rong.entity.Teacher;
15 
16 public class HibernateTest {
17     @Test
18     public void test1(){
19         Configuration configuration=new Configuration().configure();
20         ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
21         SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
22         Session session = sessionFactory.openSession();
23         Transaction transaction = session.beginTransaction();
24 
25         Teacher teacher1=new Teacher();
26         teacher1.setTname("夏雨");
27         Teacher teacher2=new Teacher();
28         teacher2.setTname("陈雅静");
29         Student student1=new Student();
30         student1.setSname("曹操");
31         student1.getTeacherSet().add(teacher1);
32         student1.getTeacherSet().add(teacher2);
33         Student student2=new Student();
34         student2.setSname("刘备");
35         student2.getTeacherSet().add(teacher1);
36         student2.getTeacherSet().add(teacher2);
37         session.save(teacher1);
38         session.save(teacher2);
39         session.save(student1);
40         session.save(student2);
41         //////////////////////////
42         Student stu=(Student) session.get(Student.class, 2);
43         Set<Teacher> teacherSet = stu.getTeacherSet();
44         for (Teacher teacher : teacherSet) {
45             System.out.println(teacher.getTid()+":"+teacher.getTname());
46         }
47         //////////////////////////
48         Teacher tea=(Teacher) session.get(Teacher.class, 2);
49         System.out.println(tea.getTid()+tea.getTname());
50         transaction.commit();
51         session.close();
52         sessionFactory.close();
53     }
54 }

 

posted @ 2018-01-10 17:00  57容杰龙  阅读(134)  评论(0编辑  收藏  举报