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 }