java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

时间:2023-03-09 04:40:48
java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

 

  hibernate.cfg.xml:

  

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--驱动名称,URL,用户名,密码 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="connection.url">
jdbc:mysql://localhost:3306/test
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<!-- 输出SQL语句 -->
<property name="show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="format_sql">true</property>
<!-- 根据映射文件生产表: create:创建(不推荐:先删除原有表,重新创建表,原有数据丢失) update:创建+更新记录(推荐,会保存原有数据) -->
<property name="hbm2ddl.auto">update</property>
<mapping resource="cn/zzsxt/entity/Classinfo.hbm.xml" />
<mapping resource="cn/zzsxt/entity/Studentinfo.hbm.xml" /> <mapping resource="cn/zzsxt/entity2/Employee.hbm.xml" />
<mapping resource="cn/zzsxt/entity2/Dept.hbm.xml" /> <mapping resource="cn/zzsxt/entity3/Province.hbm.xml" />
<mapping resource="cn/zzsxt/entity3/City.hbm.xml" /> <mapping resource="cn/zzsxt/entity4/IdCard.hbm.xml" />
<mapping resource="cn/zzsxt/entity4/Person.hbm.xml" /> <mapping resource="cn/zzsxt/entity5/IdCard2.hbm.xml" />
<mapping resource="cn/zzsxt/entity5/Person2.hbm.xml" /> <mapping resource="cn/zzsxt/entity6/Emp.hbm.xml" />
<mapping resource="cn/zzsxt/entity6/Project.hbm.xml" /> </session-factory>
</hibernate-configuration>

 

1.单向多对一:

java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

  Classinfo:

  

package cn.zzsxt.entity;

import java.io.Serializable;

public class Classinfo implements Serializable {
private int classId;
private String className; public int getClassId() {
return classId;
}
public void setClassId(int classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
} }

  Classinfo.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity">
<class name="Classinfo">
<id name="classId">
<generator class="native"></generator>
</id>
<property name="className"></property>
</class>
</hibernate-mapping>

  Studentinfo:

package cn.zzsxt.entity;

import java.io.Serializable;

public class Studentinfo implements Serializable {
private int studentId;
private String studentName;
private int studentAge;
private String studentAddress;
//和一方关联的实体对象(多对一)
private Classinfo classinfo; public Studentinfo() {
super();
// TODO Auto-generated constructor stub
} public Studentinfo(String studentName, int studentAge, String studentAddress) {
super();
this.studentName = studentName;
this.studentAge = studentAge;
this.studentAddress = studentAddress;
} public int getStudentId() {
return studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public int getStudentAge() {
return studentAge;
}
public void setStudentAge(int studentAge) {
this.studentAge = studentAge;
}
public String getStudentAddress() {
return studentAddress;
}
public void setStudentAddress(String studentAddress) {
this.studentAddress = studentAddress;
}
public Classinfo getClassinfo() {
return classinfo;
}
public void setClassinfo(Classinfo classinfo) {
this.classinfo = classinfo;
} }

  Studentinfo.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity">
<class name="Studentinfo">
<id name="studentId">
<generator class="native"></generator>
</id>
<property name="studentName"></property>
<property name="studentAge"></property>
<property name="studentAddress"></property>
<!-- 多对一 -->
<many-to-one name="classinfo" class="Classinfo" column="classId" lazy="false"></many-to-one>
</class>
</hibernate-mapping>

  

  TestManyToOneSave:

package cn.zzsxt.test;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity.Classinfo;
import cn.zzsxt.entity.Studentinfo;
import cn.zzsxt.utils.HibernateUtil; public class TestManyToOneSave {
/**
* 新建一个班级:Java01,添加两个学生zhangsan和lisi,并将这两个学生添加到Java01班级中
* @param args
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//新建班级Java01
Classinfo classinfo = new Classinfo();
classinfo.setClassName("Java01");
//新建两个学生zhangsan和lisi
Studentinfo stu1 = new Studentinfo("zhangsan",20,"郑州");
Studentinfo stu2 = new Studentinfo("lisi",22,"北京");
//维护班级和学生之间的关系:单向多对一(从多方维护关联关系):为学生指定班级
stu1.setClassinfo(classinfo);
stu2.setClassinfo(classinfo);
//保存班级和学生
session.save(classinfo);
session.save(stu1);
session.save(stu2);
tx.commit();
session.close(); }
}

  TestManyToOneSelect:

package cn.zzsxt.test;

import org.hibernate.Session;

import cn.zzsxt.entity.Classinfo;
import cn.zzsxt.entity.Studentinfo;
import cn.zzsxt.utils.HibernateUtil; public class TestManyToOneSelect {
/**
* 查询编号为1的学生信息及对应的班级信息
* @param args
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Studentinfo student = session.get(Studentinfo.class,1);
System.out.println(student.getStudentName()+"---"+student.getStudentAge());
//获取学生对应的班级信息
Classinfo classinfo = student.getClassinfo();
System.out.println("班级名称:"+classinfo.getClassName());
session.close(); }
}

 2.单向一对多:

java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

  Dept:

package cn.zzsxt.entity2;

import java.util.HashSet;
import java.util.Set; public class Dept {
private int deptId;
private String deptName;
//在一方添加一个包含多方的集合
private Set<Employee> emps = new HashSet<Employee>();
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
public Set<Employee> getEmps() {
return emps;
}
public void setEmps(Set<Employee> emps) {
this.emps = emps;
} }

  Dept.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity2">
<class name="Dept">
<id name="deptId">
<generator class="native"></generator>
</id>
<property name="deptName"></property>
<!--
name="包含多方的集合名称"
-->
<set name="emps">
<!-- column="外键名称" -->
<key column="deptId"></key>
<!-- 一对多 class="集合中元素的类型(多方的类型)" -->
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>

  Employee:

package cn.zzsxt.entity2;

public class Employee {
private int empId;
private String empName; public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
} }

  Employee.hbm,xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity2">
<class name="Employee">
<id name="empId">
<generator class="native"></generator>
</id>
<property name="empName"></property>
</class>
</hibernate-mapping>

  TestOneToManySave:

package cn.zzsxt.test;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity2.Dept;
import cn.zzsxt.entity2.Employee;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToManySave {
/**
* 添加一个部门:开发部
* 添加两个员工:小三和小四,并且将这两个员工分配到开发部
* @param args
* 推荐从多方维护关系:
* 1.生产的SQL语句数量少,执行效率较高。
* 2.可以避免因外键不能为NULL带来的异常。
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建开发部
Dept dept = new Dept();
dept.setDeptName("开发部2");
//创建两个员工
Employee emp1 = new Employee();
emp1.setEmpName("小三2");
Employee emp2 = new Employee();
emp2.setEmpName("小四2");
//单项一对多(只能在一方维护关联关系):为部门添加员工
dept.getEmps().add(emp1);
dept.getEmps().add(emp2);
//保存部门和员工
session.save(dept);
session.save(emp1);
session.save(emp2);
tx.commit();
session.close(); }
}

3.双向一对多,控制反转,级联:

java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

  City:

package cn.zzsxt.entity3;

public class City {
private int cityId;
private String cityName;
//多方添加一个和一方关联的实体对象
private Province province;
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public Province getProvince() {
return province;
}
public void setProvince(Province province) {
this.province = province;
} }

  City.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity3">
<class name="City">
<id name="cityId">
<generator class="native"></generator>
</id>
<property name="cityName"></property>
<!--
many-to-one :多对一
cascade:级联(存在关联的数据表,一份随另外关联一方做相同的操作)
delete:级联删除
save-update:级联新增或修改
all:所有操作都级联
none:不级联
-->
<many-to-one name="province" class="Province" column="provinceId" cascade="save-update" ></many-to-one>
</class>
</hibernate-mapping>

  Province:

package cn.zzsxt.entity3;

import java.util.HashSet;
import java.util.Set; public class Province {
private int provinceId;
private String provinceName;
//一份添加一个包含多方的set集合
private Set<City> cities = new HashSet<City>();
public int getProvinceId() {
return provinceId;
}
public void setProvinceId(int provinceId) {
this.provinceId = provinceId;
}
public String getProvinceName() {
return provinceName;
}
public void setProvinceName(String provinceName) {
this.provinceName = provinceName;
}
public Set<City> getCities() {
return cities;
}
public void setCities(Set<City> cities) {
this.cities = cities;
} }

  Province.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity3">
<class name="Province">
<id name="provinceId">
<generator class="native"></generator>
</id>
<property name="provinceName"></property>
<!--
name="包含多方的集合名称"
cascade="save-update|delete|all|none" 级联
inverse="true|false"
inverse代表关系维护的控制权是否反转,如果inverse值为true代表将关系维护的控制权交与对方
-->
<set name="cities" cascade="all" inverse="true">
<!-- column="外键名称" -->
<key column="provinceId"></key>
<!-- 一对多 class="集合中元素的类型(多方的类型)" -->
<one-to-many class="City"/>
</set>
</class>
</hibernate-mapping>

  TestOneToMany:

package cn.zzsxt.test;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity2.Dept;
import cn.zzsxt.entity2.Employee;
import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToMany {
/**
* 添加一个省份:河南省
* 添加一个城市:郑州市
* 将郑州市添加到河南省中
*/
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建省份
Province province = new Province();
province.setProvinceName("河南省");
//创建城市
City city = new City();
city.setCityName("郑州市");
//从一份维护关系:为省份添加城市;从多方维护关系:为城市设置省份
city.setProvince(province);
session.save(province);
session.save(city);
tx.commit();
session.close(); }
}

  TestInverse:

package cn.zzsxt.test;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil;
/**
* inverse="true":代表将关系维护的控制权交与对方(多方)进行维护,自身无法维护关联关系
* @author Think
*
*/
public class TestInverse {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建一个河北省
Province province = new Province();
province.setProvinceName("山东省2");
//创建一个城市
City city = new City();
city.setCityName("济南2");
City city2 = new City();
city2.setCityName("菏泽2");
//为省份添加城市
province.getCities().add(city);
province.getCities().add(city2);
//通过省份级联城市
session.save(province);
tx.commit();
session.close(); }
}

  TestCascade:

package cn.zzsxt.test;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil; public class TestCascade {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建一个河北省
Province province = new Province();
province.setProvinceName("山东省");
//创建一个城市
City city = new City();
city.setCityName("济南");
City city2 = new City();
city2.setCityName("菏泽");
//为省份添加城市
province.getCities().add(city);
province.getCities().add(city2);
//通过省份级联城市
session.save(province);
tx.commit();
session.close(); }
}

  TestCascade2:

package cn.zzsxt.test;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity3.City;
import cn.zzsxt.entity3.Province;
import cn.zzsxt.utils.HibernateUtil; public class TestCascade2 {
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建一个河北省
Province province = new Province();
province.setProvinceName("河北省");
//创建一个城市
City city = new City();
city.setCityName("石家庄");
//为城市设置省份
city.setProvince(province);
//使用级联新增城市的同时新增省份
session.save(city);
tx.commit();
session.close(); }
}

4.一对一主键关联:

java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

  IdCard:

package cn.zzsxt.entity4;

public class IdCard {
private int id;
private String cardNo;//身份证号;
private Person person;//关联的实体对象 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
} }

  IdCard.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity4">
<class name="IdCard">
<id name="id">
<!-- foreign:主键生产策略,该主键的值来源"外部"-->
<generator class="foreign">
<!-- 利用property属性指定主键来源于person中的主键 -->
<param name="property">person</param>
</generator>
</id>
<property name="cardNo"></property>
<!--
one-to-one:一对一
name属性:关联对象的名称
class属性:关联对象的类型
cascade:级联
constrained="true|false":可选属性. 代表是否是约束属性.
配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
数据与本表数据对应. -->
<one-to-one name="person" class="Person" constrained="true"></one-to-one>
</class>
</hibernate-mapping>

  Person:

package cn.zzsxt.entity4;

public class Person {
private int id;
private String name;
private IdCard idCard;//关联的实体对象
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
} }

  Person.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity4">
<class name="Person">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!--
one-to-one:一对一
name属性:关联对象的名称
class属性:关联对象的类型
cascade:级联
constrained="true|false":可选属性. 代表是否是约束属性.
配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
数据与本表数据对应. -->
<one-to-one name="idCard" class="IdCard" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>

  TestOneToOne:

package cn.zzsxt.test2;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity4.IdCard;
import cn.zzsxt.entity4.Person;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToOne {
public static void main(String[] args) {
Session session =HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Person person = new Person();
person.setName("zhangsan");
IdCard idCard = new IdCard();
idCard.setCardNo("412722199001011234");
//为人设置身份证
person.setIdCard(idCard);
//为身份证指定人
idCard.setPerson(person);
//通过级联添加人和身份证
session.save(person);
tx.commit();
session.close(); }
}

5.一对唯一外键关联:

java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

  IdCard2:

package cn.zzsxt.entity5;

public class IdCard2 {
private int id;
private String cardNo;//身份证号;
private Person2 person2;//关联的实体对象 public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public Person2 getPerson2() {
return person2;
}
public void setPerson2(Person2 person2) {
this.person2 = person2;
} }

  Idcard2.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity5">
<class name="IdCard2">
<id name="id">
<generator class="native"></generator>
</id>
<property name="cardNo"></property>
<!-- 多对一 -->
<many-to-one name="person2" class="Person2" column="pid" unique="true"></many-to-one>
</class>
</hibernate-mapping>

  Person2:

package cn.zzsxt.entity5;

public class Person2 {
private int id;
private String name;
private IdCard2 idCard2;//关联的实体对象
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IdCard2 getIdCard2() {
return idCard2;
}
public void setIdCard2(IdCard2 idCard2) {
this.idCard2 = idCard2;
} }

  Person2.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity5">
<class name="Person2">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!--
one-to-one:一对一
name属性:关联对象的名称
class属性:关联对象的类型
cascade:级联
constrained="true|false":可选属性. 代表是否是约束属性.
配置在这里,代表当前属性为约束属性,一定在这个属性对应的表中有
数据与本表数据对应. -->
<one-to-one name="idCard2" class="IdCard2" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>

  TestOneToOne2:

package cn.zzsxt.test2;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity5.IdCard2;
import cn.zzsxt.entity5.Person2;
import cn.zzsxt.utils.HibernateUtil; public class TestOneToOne2 {
public static void main(String[] args) {
Session session =HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Person2 person = new Person2();
person.setName("zhangsan");
IdCard2 idCard = new IdCard2();
idCard.setCardNo("412722199001011234");
//为人设置身份证
person.setIdCard2(idCard);
//为身份证指定人
idCard.setPerson2(person);
//通过级联添加人和身份证
session.save(person);
tx.commit();
session.close(); }
}

6.多对多双向关联:

java:Hibernate框架2(关联映射(多对一,一对多,一对多双向,一对一主键,一对一唯一外键,多对多双向))

  Emp:

package cn.zzsxt.entity6;

import java.util.HashSet;
import java.util.Set; public class Emp {
private int empId;
private String empName;
private Set<Project> projects = new HashSet<Project>();
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Set<Project> getProjects() {
return projects;
}
public void setProjects(Set<Project> projects) {
this.projects = projects;
} }  

  Emp.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity6">
<class name="Emp" table="tbl_emp">
<id name="empId">
<generator class="native"></generator>
</id>
<property name="empName"></property>
<!--
table="中间表的表名"
-->
<set name="projects" table="tbl_emp_project" cascade="all">
<!-- column:中间表中与Emp对应的外键名称 -->
<key column="empId"></key>
<!--
many-to-many:多对多
class="集合中的元素类型"
column="中间表中与Project对应的外键名称"
-->
<many-to-many class="Project" column="projectId"></many-to-many>
</set>
</class>
</hibernate-mapping>

  project:

package cn.zzsxt.entity6;

import java.util.HashSet;
import java.util.Set; public class Project {
private int projectId;
private String projectName;
private Set<Emp> emps = new HashSet<Emp>(); public int getProjectId() {
return projectId;
}
public void setProjectId(int projectId) {
this.projectId = projectId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public Set<Emp> getEmps() {
return emps;
}
public void setEmps(Set<Emp> emps) {
this.emps = emps;
} }

  Project.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.zzsxt.entity6">
<class name="Project" table="tbl_project">
<id name="projectId">
<generator class="native"></generator>
</id>
<property name="projectName"></property>
<!--
table="中间表的表名"
-->
<set name="emps" table="tbl_emp_project" inverse="true">
<!-- column:中间表中与Project对应的外键名称 -->
<key column="projectId"></key>
<!--
many-to-many:多对多
class="集合中的元素类型"
column="中间表中与Emp对应的外键名称"
-->
<many-to-many class="Emp" column="empId"></many-to-many>
</set>
</class>
</hibernate-mapping>

  TestManyToMany:

package cn.zzsxt.test2;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.zzsxt.entity6.Emp;
import cn.zzsxt.entity6.Project;
import cn.zzsxt.utils.HibernateUtil;
/**
*
* 添加两个员工:zhangsan和lisi
* 添加两个项目:OA项目和CRM项目
* 将zhangsan和lisi分配到OA项目组
* 将lisi分配到CRM项目组
* @author Think
*
*/
public class TestManyToMany {
public static void main(String[] args) {
Session session =HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//创建两个员工
Emp emp1 = new Emp();
emp1.setEmpName("张三");
Emp emp2 = new Emp();
emp2.setEmpName("李四");
//创建两个项目
Project project1 = new Project();
project1.setProjectName("OA项目");
Project project2 = new Project();
project2.setProjectName("CRM项目");
//关系维护的控制权在emp方,为员工添加项目
emp1.getProjects().add(project1);//为张三分配OA项目
emp2.getProjects().add(project1);//为李四分配OA项目
emp2.getProjects().add(project2);//为李四分配CRM项目
//保存员工和项目(级联)
session.save(emp1);
session.save(emp2);
tx.commit();
session.close(); }
}