首页 > 代码库 > Hibernate4.x之映射关系--多对多
Hibernate4.x之映射关系--多对多
n-n的关联关系分为以下两类:
1.单向n-n关联关系:
- n-n的关联必须使用连接表
- 与1-n映射类似,必须为set集合元素添加key子元素,指定CATEGORIES_ITEMS表中参照CATEGORIES表的外键为CATEGORIY_ID。与1-n关联映射不同的是,建立n-n关联时,集合中的元素使用many-to-many。many-to-many子元素的class属性指定items接种存放的是Item对象,column属性指定CATEGORIES_ITEMS表中参照ITEMS表的外键为ITEM_ID
--------------------------------代码--------------------------------------------------------
Category.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 2014-11-29 21:45:04 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.yl.hibernate.n2n"> 6 <class name="Category" table="CATEGORYS"> 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 <!-- table:指定中间表 -->15 <set name="items" table="CATEGORIRIES_ITEMS" inverse="false" lazy="true">16 <key>17 <column name="C_ID" />18 </key>19 <!-- 使用many-to-many 指定多对多的关联关系, column指定set集合中的持久化类在中间表的外键列的名称 -->20 <many-to-many class="Item" column="I_ID"/>21 </set>22 </class>23 </hibernate-mapping>
Item.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 2014-11-29 21:45:04 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.n2n.Item" table="ITEMs"> 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 </class>15 </hibernate-mapping>
2.双向n-n关联关系
- 双向n-n关联需要两端都使用集合属性
- 双向n-n关联必须使用连接表
- 集合属性应增加key子元素用以映射外键列,集合元素里还应增加many-to-many子元素关联实体类
- 在双向n-n关联的两边都需指定连接表的表名及外键列的列名。两个集合元素set的table元素的值必须指定,且必须相同。set元素的两个子元素:key和many-to-many多必须指定column属性,其中,key和many-to-many分别制定本持久化类和关联类在连接表中的外键列名,因此两边的key与many-to-many的column属性交叉相同。也就是说,一边的set元素的key的column值为a,many-to-many的column为b,则另一边的set元素的key的column值为b,many-to-many的column值为a
- 对于双向n-n关联,必须把其中一端的inverse设置为true,否则两端都维护关联关系可能会造成逐渐冲突
Category.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 2014-11-29 21:45:04 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping package="com.yl.hibernate.n2n"> 6 <class name="Category" table="CATEGORYS"> 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 <!-- table:指定中间表 -->15 <set name="items" table="CATEGORIRIES_ITEMS" inverse="false" lazy="true">16 <key>17 <column name="C_ID" />18 </key>19 <!-- 使用many-to-many 指定多对多的关联关系, column指定set集合中的持久化类在中间表的外键列的名称 -->20 <many-to-many class="Item" column="I_ID"/>21 </set>22 </class>23 </hibernate-mapping>
Item.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 2014-11-29 21:45:04 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.n2n.Item" table="ITEMs"> 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 <set name="categories" table="CATEGORIRIES_ITEMS" inverse="true">16 <key><column name="I_ID"></column></key>17 <many-to-many class="com.yl.hibernate.n2n.Category" column="C_ID"></many-to-many>18 </set>19 20 </class>21 </hibernate-mapping>
测试类:
1 package com.yl.hibernate.n2n; 2 3 4 import java.util.Set; 5 6 import org.hibernate.Session; 7 import org.hibernate.SessionFactory; 8 import org.hibernate.Transaction; 9 import org.hibernate.cfg.Configuration;10 import org.hibernate.service.ServiceRegistry;11 import org.hibernate.service.ServiceRegistryBuilder;12 import org.junit.After;13 import org.junit.Before;14 import org.junit.Test;15 16 public class HibernateTest {17 18 private SessionFactory sessionFactory;19 private Session session;20 private Transaction transaction;21 22 @Before23 public void init() {24 Configuration configuration = new Configuration().configure();25 ServiceRegistry serviceRegistry = 26 new ServiceRegistryBuilder().applySettings(configuration.getProperties())27 .buildServiceRegistry();28 29 sessionFactory = configuration.buildSessionFactory(serviceRegistry);30 31 session = sessionFactory.openSession();32 33 transaction = session.beginTransaction();34 }35 @After36 public void destory() {37 transaction.commit();38 39 session.close();40 41 sessionFactory.close();42 }43 44 @Test45 public void testSave() {46 Category category1 = new Category();47 category1.setName("C-AA");48 49 Category category2 = new Category();50 category2.setName("C-BB");51 52 53 Item item1 = new Item();54 item1.setName("I-AA");55 56 Item item2 = new Item();57 item2.setName("I-BB");58 59 //设定关联关系60 category1.getItems().add(item1);61 category1.getItems().add(item2);62 63 category2.getItems().add(item1);64 category2.getItems().add(item2);65 66 item1.getCategories().add(category1);67 item1.getCategories().add(category2);68 69 item2.getCategories().add(category1);70 item2.getCategories().add(category2);71 72 //执行保存操作73 session.save(category1);74 session.save(category2);75 76 session.save(item1);77 session.save(item2);78 }79 80 81 @Test82 public void testGet() {83 Category category = (Category) session.get(Category.class, 1);84 System.out.println(category.getName());85 //需要连接中间表86 Set<Item> items = category.getItems();87 System.out.println(items.size());88 89 }90 91 }
Hibernate4.x之映射关系--多对多
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。