pom.xml
hibernate.cfg.xml
一对一,方案一使用主从关系,从表id生成依赖主表id
一对一 方案二:从表创建一个外键
多对一
一对多
多对多 方案一
多对多 方案二:分成两个一对多
<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();
}
}