Hibernate的多对多映射
一、创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql、Oracle、SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 8 <!-- 配置连接数据库的基本信息 --> 9 <property name="connection.username">root</property> 10 <property name="connection.password"></property> 11 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 12 <!-- <property name="connection.url">jdbc:mysql:///mis</property> --> 13 <property name="connection.url"> 14 <![CDATA[jdbc:mysql://localhost:3306/mis?useUnicode=true&characterEncoding=utf8]]> 15 </property> 16 17 18 <!-- 配置 hibernate 的基本信息 --> 19 <!-- hibernate 所使用的数据库方言 --> 20 <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 21 22 <!-- 执行操作时是否在控制台打印 SQL --> 23 <property name="show_sql">true</property> 24 25 <!-- 是否对 SQL 进行格式化 --> 26 <property name="format_sql">true</property> 27 28 <!-- 指定自动生成数据表的策略 --> 29 <property name="hbm2ddl.auto">update</property> 30 31 <!-- 设置 Hibernate 的事务隔离级别 2:读已提交的记录--> 32 <property name="connection.isolation">2</property> 33 34 <!-- 删除对象后, 使其 OID 置为 null --> 35 <property name="use_identifier_rollback">true</property> 36 37 <!-- 配置 C3P0 数据源 --> 38 <property name="hibernate.c3p0.max_size">10</property> 39 <property name="hibernate.c3p0.min_size">5</property> 40 <property name="c3p0.acquire_increment">2</property> 41 42 <property name="c3p0.idle_test_period">2000</property> 43 <property name="c3p0.timeout">2000</property> 44 45 <property name="c3p0.max_statements">10</property> 46 47 <!-- 设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数 --> 48 <property name="hibernate.jdbc.fetch_size">100</property> 49 50 <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 --> 51 <property name="jdbc.batch_size">30</property> 52 53 <!-- 指定关联的 .hbm.xml 文件 --> 54 <!-- 55 <mapping resource="com/mcs/hibernate/entities/onetoone/foreign/Manager.hbm.xml" /> 56 <mapping resource="com/mcs/hibernate/entities/onetoone/foreign/Department.hbm.xml" /> 57 --> 58 <!-- 59 <mapping resource="com/mcs/hibernate/entities/onetoone/primary/Manager.hbm.xml" /> 60 <mapping resource="com/mcs/hibernate/entities/onetoone/primary/Department.hbm.xml" /> 61 --> 62 <!-- 63 <mapping resource="com/mcs/hibernate/entities/manytomany/Category.hbm.xml" /> 64 <mapping resource="com/mcs/hibernate/entities/manytomany/Product.hbm.xml" /> 65 --> 66 <!-- 67 <mapping resource="com/mcs/hibernate/entities/subclass/Person.hbm.xml" /> 68 --> 69 <!-- 70 <mapping resource="com/mcs/hibernate/entities/joined/subclass/Person.hbm.xml" /> 71 --> 72 73 <mapping resource="com/mcs/hibernate/entities/union/subclass/Person.hbm.xml" /> 74 75 76 </session-factory> 77 78 </hibernate-configuration>
二、建立多对多的映射
1、创建Java实体类
1 package com.mcs.hibernate.entities.manytomany; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class Category { 7 8 private Integer id; 9 private String name; 10 11 private Set<Product> products = new HashSet<>(); 12 13 public Integer getId() { 14 return id; 15 } 16 17 public void setId(Integer id) { 18 this.id = id; 19 } 20 21 public String getName() { 22 return name; 23 } 24 25 public void setName(String name) { 26 this.name = name; 27 } 28 29 public Set<Product> getProducts() { 30 return products; 31 } 32 33 public void setProducts(Set<Product> products) { 34 this.products = products; 35 } 36 37 38 39 }
1 package com.mcs.hibernate.entities.manytomany; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class Product { 7 8 private Integer id; 9 private String name; 10 11 private Set<Category> categories = new HashSet<>(); 12 13 public Integer getId() { 14 return id; 15 } 16 public void setId(Integer id) { 17 this.id = id; 18 } 19 public String getName() { 20 return name; 21 } 22 public void setName(String name) { 23 this.name = name; 24 } 25 public Set<Category> getCategories() { 26 return categories; 27 } 28 public void setCategories(Set<Category> categories) { 29 this.categories = categories; 30 } 31 32 33 34 }
2、根据实体类创建对应的 hbm.xml文件
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2015-10-28 14:53:27 by Hibernate Tools 3.5.0.Final --> 5 <hibernate-mapping> 6 <class name="com.mcs.hibernate.entities.manytomany.Category" table="CATEGORIES"> 7 <id name="id" type="java.lang.Integer"> 8 <column name="ID" /> 9 <generator class="native" /> 10 </id> 11 <property name="name" type="java.lang.String"> 12 <column name="NAME" /> 13 </property> 14 15 <!-- table: 指定中间表 --> 16 <set name="products" table="CATEGORIES_PRODUCTS" inverse="true"> 17 <key> 18 <column name="CATEGORY_ID" /> 19 </key> 20 <!-- 使用 many-to-many 指定多对多的关联关系. column 执行 Set 集合中的持久化类在中间表的外键列的名称 --> 21 <many-to-many class="com.mcs.hibernate.entities.manytomany.Product" column="PRODUCT_ID"/> 22 </set> 23 </class> 24 </hibernate-mapping>
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2015-10-28 14:53:27 by Hibernate Tools 3.5.0.Final --> 5 <hibernate-mapping> 6 <class name="com.mcs.hibernate.entities.manytomany.Product" table="PRODUCTS"> 7 <id name="id" type="java.lang.Integer"> 8 <column name="ID" /> 9 <generator class="native" /> 10 </id> 11 <property name="name" type="java.lang.String"> 12 <column name="NAME" /> 13 </property> 14 15 <!-- table: 指定中间表 --> 16 <set name="categories" table="CATEGORIES_PRODUCTS"> 17 <key> 18 <column name="PRODUCT_ID" /> 19 </key> 20 <!-- 使用 many-to-many 指定多对多的关联关系. column 执行 Set 集合中的持久化类在中间表的外键列的名称 --> 21 <many-to-many class="com.mcs.hibernate.entities.manytomany.Category" column="CATEGORY_ID"/> 22 </set> 23 </class> 24 </hibernate-mapping>
3、备注:
1、使用 many-to-many 指定多对多的关联关系.
table: 指定中间表
Key:当前持久化类在中间表的外键列的名称
column:执行 Set 集合中的持久化类在中间表的外键列的名称
2、为了不重复更新,在其中的一端设置 inverse="true"的属性
3、在查询时需要连接中间表