<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.chen</groupId> <artifactId>hibernate_demo01</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <build/> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> </dependency> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.18.1-GA</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> </dependencies> </project>
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="show_sql">true</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.pool.size">20</property> <property name="connection.characterEncoding">utf8</property> <property name="current_session_context_class">thread</property> <mapping class="com.chen.pojo.Teacher"/> <mapping class="com.chen.pojo.Course"/> <mapping class="com.chen.pojo.TeacherRelCourse"/> </session-factory> </hibernate-configuration>
一对一,方案一使用主从关系,从表id生成依赖主表id
主表 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; @Table(name="t_person") @Entity public class Person { private Long id ; private String name ; private Idcard idcard; @Id @GeneratedValue @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToOne @PrimaryKeyJoinColumn public Idcard getIdcard() { return idcard; } public void setIdcard(Idcard idcard) { this.idcard = idcard; } } 从表 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @Table(name="t_idcard") @Entity public class Idcard { private Long id ; private String name ; private Person person ; @Id @GenericGenerator(name="pkGenerator",strategy="foreign",parameters={@Parameter(name="property",value="person")}) @GeneratedValue(generator="pkGenerator") @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToOne(targetEntity=Person.class,mappedBy="idcard") public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } } 测试案例 package com.chen.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.Test; import com.chen.pojo.Idcard; import com.chen.pojo.Person; public class One2OneDemo1 { private SessionFactory sessionFactory ; public One2OneDemo1() { if(sessionFactory==null){ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } } @Test public void test1(){ Session session = sessionFactory.openSession(); Transaction tr = session.beginTransaction(); Idcard idcard = new Idcard(); idcard.setName("idcard"); Person p = new Person(); p.setName("chen"); p.setIdcard(idcard); idcard.setPerson(p); session.save(p); session.save(idcard); tr.commit(); session.close(); } @Test public void test2(){ Session s = sessionFactory.openSession(); Transaction tr = s.beginTransaction(); Person p = (Person) s.get(Person.class, 4L); System.out.println(p.getName()+" "+p.getId()+" "+p.getIdcard().getName()); tr.commit(); s.close(); } }
一对一 方案二:从表创建一个外键
主表 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Table(name="t_husband") @Entity public class Husband { private Long id ; private String name ; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } } 从表 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name="t_wife") @Entity public class Wife { private Long id ; private Husband husband ; private String name ; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @OneToOne(fetch=FetchType.LAZY) @JoinColumn(name="h_id") public Husband getHusband() { return husband; } public void setHusband(Husband husband) { this.husband = husband; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } } 测试案例 package com.chen.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.Test; import com.chen.pojo.Husband; import com.chen.pojo.Wife; public class One2OneDemo2 { private SessionFactory sessionFactory ; public One2OneDemo2() { if(sessionFactory==null){ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } } @Test public void test1(){ Session s = sessionFactory.openSession(); Transaction tr = s.beginTransaction(); Husband h = new Husband(); h.setName("husband"); Wife w = new Wife(); w.setName("wife"); w.setHusband(h); s.save(h); s.save(w); tr.commit(); s.close(); } @Test public void test2(){ Session s = sessionFactory.openSession(); Wife w = (Wife) s.get(Wife.class,1L); System.out.println(w.getName()+" "+w.getHusband().getName()); s.close(); } }
多对一
一 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Table(name="t_temp_department") @Entity public class Department { private Long id ; private String departmentName ; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="department_name") public String getDepartmentName() { return departmentName; } public void setDepartmentName(String departmentName) { this.departmentName = departmentName; } } 多 方表 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.Table; @Table(name="t_employee") @Entity public class Employee { private Long id ; private String name ; private Department department; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToOne(targetEntity=Department.class) public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } } 测试案例 package com.chen.test; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.Test; import com.chen.pojo.Department; import com.chen.pojo.Employee; public class Many2OneDemo1 { private SessionFactory sessionFactory ; public Many2OneDemo1() { if(sessionFactory==null){ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } } @Test public void test1(){ Session session = sessionFactory.openSession(); Department department = new Department(); department.setDepartmentName("department_2"); Employee emp = new Employee(); emp.setName("emp_2"); emp.setDepartment(department); Transaction tr = session.beginTransaction(); session.save(emp); session.save(department); tr.commit(); session.close(); } @Test public void test2(){ Session session = sessionFactory.openSession(); String hql = "from Employee t where t.id=1"; Query query = session.createQuery(hql); List<Employee> list =(List<Employee>)query.list(); for(Employee e : list){ System.out.println(e.getName()+" "+e.getDepartment().getDepartmentName()); } session.close(); } }
一对多
一 package com.chen.pojo; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToMany; import javax.persistence.Table; @Table(name="t_temp_department") @Entity public class Department2 { private Long id ; private String departmentName ; private Set<Employee2> emps; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="department_name") public String getDepartmentName() { return departmentName; } public void setDepartmentName(String departmentName) { this.departmentName = departmentName; } @OneToMany(targetEntity=Employee2.class) @JoinColumn(name="department_id") public Set<Employee2> getEmps() { return emps; } public void setEmps(Set<Employee2> emps) { this.emps = emps; } } 多 方表 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Table(name="t_employee") @Entity public class Employee2 { private Long id ; private String name ; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } } 测试案例 package com.chen.test; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.Test; import com.chen.pojo.Department2; public class One2ManyDemo1 { private SessionFactory sessionFactory ; public One2ManyDemo1() { if(sessionFactory==null){ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } } @Test public void test1(){ Session session = sessionFactory.openSession(); String hql = "from Department2 t where t.id=1"; Query query = session.createQuery(hql); List<Department2> list =(List<Department2>)query.list(); for(Department2 d : list){ System.out.println(d.getDepartmentName()+" "+d.getEmps().size()); } session.close(); } }
多对多 方案一
package com.chen.pojo; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToMany; import javax.persistence.Table; @Table(name="t_admin") @Entity public class Admin { private Long id ; private String name ; private Set<Role> roles ; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany(mappedBy="admins") public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } } package com.chen.pojo; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.Table; @Table(name="t_role") @Entity public class Role { private Long id ; private String name ; private Set<Admin> admins; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @ManyToMany @JoinTable(name="t_role_admin",joinColumns={@JoinColumn(name="r_id")}, inverseJoinColumns={@JoinColumn(name="a_id")}) public Set<Admin> getAdmins() { return admins; } public void setAdmins(Set<Admin> admins) { this.admins = admins; } } 测试案例 package com.chen.test; import java.util.HashSet; import java.util.Set; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.junit.Test; import com.chen.pojo.Admin; import com.chen.pojo.Role; public class Many2ManyDemo1 { private SessionFactory sessionFactory ; public Many2ManyDemo1() { if(sessionFactory==null){ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } } @Test public void test1(){ Set<Admin> sets1 = new HashSet<Admin>(); Set<Admin> sets2 = new HashSet<Admin>(); Session s = sessionFactory.openSession(); Transaction tr = s.beginTransaction(); Admin a1 = new Admin(); a1.setName("name1"); sets1.add(a1); sets2.add(a1); Admin a2 = new Admin(); a2.setName("name2"); sets2.add(a2); Role r1 = new Role(); r1.setName("role1"); Role r2 = new Role(); r2.setName("role2"); r1.setAdmins(sets1); r2.setAdmins(sets2); s.save(a1); s.save(a2); s.save(r1); s.save(r2); tr.commit(); s.close(); } }
多对多 方案二:分成两个一对多
一表1 package com.chen.pojo; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; @Table(name="t_teacher") @Entity public class Teacher { private Long id ; private String name ; private Set<TeacherRelCourse> coursRels; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(mappedBy="teacher") @LazyCollection(LazyCollectionOption.EXTRA) public Set<TeacherRelCourse> getCoursRels() { return coursRels; } public void setCoursRels(Set<TeacherRelCourse> coursRels) { this.coursRels = coursRels; } } 一表2 package com.chen.pojo; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; import org.hibernate.annotations.LazyCollection; import org.hibernate.annotations.LazyCollectionOption; @Table(name="t_course") @Entity public class Course { private Long id ; private String name ; private Set<TeacherRelCourse> teacherRels; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String name) { this.name = name; } @OneToMany(mappedBy="course") @LazyCollection(LazyCollectionOption.EXTRA) public Set<TeacherRelCourse> getTeacherRels() { return teacherRels; } public void setTeacherRels(Set<TeacherRelCourse> teacherRels) { this.teacherRels = teacherRels; } } 多 方表 package com.chen.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Table(name="t_teacher_course") @Entity public class TeacherRelCourse { private Long id ; private Teacher teacher; private Course course; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @ManyToOne @JoinColumn(name="t_id") public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } @ManyToOne @JoinColumn(name="c_id") public Course getCourse() { return course; } public void setCourse(Course course) { this.course = course; } } 测试案例 package com.chen.test; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.classic.Session; import org.junit.Test; import com.chen.pojo.Course; import com.chen.pojo.Teacher; import com.chen.pojo.TeacherRelCourse; public class Many2ManyDemo2 { private SessionFactory sessionFactory ; public Many2ManyDemo2() { if(sessionFactory==null){ sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } } @Test public void test1(){ Session s = sessionFactory.openSession(); Transaction tr = s.beginTransaction(); TeacherRelCourse tc1 = new TeacherRelCourse(); TeacherRelCourse tc2 = new TeacherRelCourse(); TeacherRelCourse tc3 = new TeacherRelCourse(); Teacher t1 = new Teacher(); t1.setName("teacher1"); tc1.setTeacher(t1); Teacher t2 = new Teacher(); t2.setName("teacher2"); tc2.setTeacher(t2); tc3.setTeacher(t2); Course c1 = new Course(); c1.setName("course1"); tc1.setCourse(c1); tc2.setCourse(c1); Course c2 = new Course(); c2.setName("course2"); tc3.setCourse(c2); s.save(t1); s.save(t2); s.save(c1); s.save(c2); s.save(tc1); s.save(tc2); s.save(tc3); tr.commit(); s.close(); } @Test public void test2(){ Session s = sessionFactory.openSession(); Teacher t1 = (Teacher)s.get(Teacher.class,1L); System.out.println(t1.getName()+" "+t1.getCoursRels().size()); for(TeacherRelCourse obj : t1.getCoursRels()){ System.out.println(obj.getCourse().getName()); } s.close(); } @Test public void test3(){ Session s = sessionFactory.openSession(); Teacher t1 = (Teacher)s.get(Teacher.class,2L); System.out.println(t1.getName()+" "+t1.getCoursRels().size()); for(TeacherRelCourse obj : t1.getCoursRels()){ System.out.println(obj.getCourse().getName()); } s.close(); } }