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

本文将展示如何在Java应用中通过Maven管理依赖并整合Hibernate ORM框架,实现数据库连接与对象关系映射。重点包括配置hibernate.cfg.xml文件、定义实体类以及演示一对一、多对一和多对多关系的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值