hibernate一对一,一对多,多对一,多对多注解实现案例

pom.xml
<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();
	}
}

猜你喜欢

转载自chentian114.iteye.com/blog/2277119