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     @Before
23     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     @After
36     public void destory() {
37         transaction.commit();
38
39         session.close();
40
41         sessionFactory.close();
42     }
43
44     @Test
45     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     @Test
82     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 }

  

时间: 2024-08-23 05:54:49

Hibernate4.x之映射关系--多对多的相关文章

Hibernate4.x之映射关系--单向一对多

在领域模型中,类与类之间最普遍的关系就是关联关系在UML中,关联是有方向的 以Customer和Order为例:一个用户能发出多个订单,而一个订单只能属于一个客户.从Order到Customer的关联是多对一关联:而从Customer到Order是一对多关联 单向n-1 单向n-1关联只需从n的一端可以访问到1的一端 域模型:从Order到Customer的多对一单向关联需要在Order类中定义一个Customer属性,而在Customer类中无需定义存放Order对象的集合属性 关系数据模型:

Hibernate4.x之映射关系--双向1-n

双向1-n与双向n-1是完全相同的两种情形 双向1-n需要在1的一端可以访问n的一端,反之亦然. 域模型:从Order到Customer的多对一双向关联需要在Order类中定义一个Customer属性,而在Customer类中需定义存放Order对象的集合属性 关系数据模型:ODDERS表中的CUSTOMER_ID参照CUSTOMER表的主键 当Session从数据库中加载Java集合时,创建的是Hibernate内置集合类的实例,因此在持久化类中定义集合属性时必须把属性声明为Java接口类型

Hibernate映射关系-多对多

接着上几篇博客,hibernate的映射关系,今天我们说说基本关系的最后一种:多对多. 一 .多对多关系 现象:多对多关系,在生活中很常见,就那学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择.还有就是一个用户可以有多个角色,一个角色可以有多个人,等等这样的例子很多. hibernate实现:多对多关联关系采用第三张表的方式来实现,将多对多转化为两个一对多. 当然,多对多也是有方向的.拿用户--角色来画类图. 1.单向关联--用户关联角色 多对多关系在hbm文

Hibernate4.x之映射关系--一对一映射

Hibernate的1-1映射关系主要分为两类: 1.Hibernate基于外键映射的1对1关联关系 对于基于外键的1-1关联,其外键可以存放在任意一边,在需要存放外键一端,增加many-to-one元素.为many-to-one元素增加unique="true"属性表示为1-1关联 1 <many-to-one name="mgr" class="com.yl.hibernate.one2one.foreign.Manager" colu

Hibernate4.x之映射关系--继承映射

Hibernate的继承映射可以理解为持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持以下三种继承映射策略: 使用subclass进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态 使用joined-subclass进行映射:对于继承关系中的子类使用同一个表,这就需要在数据库表汇总增加额外的区分子类类型的字段 使用union-

hibernate注解方式来处理映射关系

在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用annotation的方式可以更简介,所以这里就简单记录下通过annotation来配置各种映射关系,在hibernate4以后已经将annotation的jar包集成进来了,如果使用hibernate3的版本就需要引入annotation的jar包. 一.单对象操作 @Entity

hibernate annotation注解方式来处理映射关系

在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,我在试了这两种方式以后,发现使用annotation的方式可以更简介,所以这里就简单记录下通过annotation来配置各种映射关系,在hibernate4以后已经将annotation的jar包集成进来了,如果使用hibernate3的版本就需要引入annotation的jar包. 一.单对象操作 @Entity

MyBatis --- 映射关系【一对一、一对多、多对多】,懒加载机制

映射(多.一)对一的关联关系 1)若只想得到关联对象的id属性,不用关联数据表 2)若希望得到关联对象的其他属性,要关联其数据表 举例: 员工与部门的映射关系为:多对一 1.创建表 员工表 确定其外键是部门表的 id DROP TABLE IF EXISTS emp; CREATE TABLE emp( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(255) DEFAULT NULL, gender CHAR(1

Hibernate学习8—Hibernate 映射关系(多对多)

第二节:Hibernate 多对多映射关系实现 比如学生和课程是多对多的关系: 一个学生可以选多个课程: 一个课程可以被多个学生选中,所以是多对多的关系: 1,多对多单向实现: 单向关系: 这里通过学生可以获取这个学生选修的课程: 但是通过课程无法获取选修这门课程的学生: Student.java: package com.cy.model; import java.util.HashSet; import java.util.Set; public class Student { privat