`

Hibernate关联映射-many to many 外键单向关联.

 
阅读更多

 

多对多的实例很多,这里说一个比较简单的例子,而且还是单向引用.. 比如说一个人可以对应多个地址,一个地址可以被多个人所拥有..

 

这就是对多多的关联关系,

 

 

在做多对多的关联的时候,一定要注意,别遗漏 中间表的配置。

 

下面是Pojo的类:

Person_FK_Many_to_Many:

public class Person_FK_Many_to_Many implements Serializable{
	
	private static final long serialVersionUID = -7132895885951796381L;
	private Integer id;
	private String name;
	private Integer age;
	
	private Set<Address_FK_Many_to_Many> addressFKManyToManieSet = new HashSet<Address_FK_Many_to_Many>();

                //getter 和setter方法省略;
}

 

 

Address_FK_Many_to_Many:

public class Address_FK_Many_to_Many {
	private Integer addressID;
	private String addressDetail;
	
                //getter和setter方法省略;
}

 

下面是Hibernate配置代码:

Person_FK_Many_to_Many.hbm.xml:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
 <class name="pack.java.model.Person_FK_Many_to_Many" table="ZHT_PERSON_FK_MANY_TO_MANY">
  <id name="id">
   		<generator class="identity"/>
  </id>
 	
 	<property name="name" column="NAME"></property>
 	<property name="age" column="AGE"></property>
 	<!--
                      ZHT_PERSON_ADDRESS_MANY_TO_MANY 这个set中的table,是指映射到数据库中的中间表; 用来存储personID 和 AddressID。
                  -->
 	<set name="addressFKManyToManieSet" lazy="false" table="ZHT_PERSON_ADDRESS_MANY_TO_MANY" inverse="false" cascade="all">
 		<key column="id" not-null="false" ></key>
 		<many-to-many column="addressID" class="pack.java.model.Address_FK_Many_to_Many">
 		</many-to-many>
 	</set>
 </class>
</hibernate-mapping>

 

Address_FK_Many_to_Many.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="pack.java.model.Address_FK_Many_to_Many" table="ZHT_ADDRESS_FK_MANY_TO_MANY">
		<id name="addressID">
			<generator class="identity"></generator>
		</id>
		
		<property name="addressDetail" column="addressDetail"></property>
	</class>
</hibernate-mapping>

 

 

然后再Hibernate.cfg.xml中,把刚刚建立的两个*.hbm.xml文件。

<mapping resource="pack/java/model/Address_FK_Many_to_Many.hbm.xml"/>
 <mapping resource="pack/java/model/Person_FK_Many_to_Many.hbm.xml"/>

 

最后,就写一个测试类,来测试刚刚配置的单向多对多的关联关系.

 

package pack.java.test;

import java.util.List;
import java.util.Set;

import org.hibernate.Query;
import org.hibernate.Session;

import pack.java.hibernate.HibernateSessionFactory;
import pack.java.model.Address_FK_Many_to_Many;
import pack.java.model.Person_FK_Many_to_Many;
/**
 * 一个人可以对应多个地址,一个地址,也可以对应多个人。
 * @author Administrator
 *
 */
public class HibernateDemoManyToMany {
	private Session getSession(){
		Session session = HibernateSessionFactory.getSession();
		return session;
	}
	
	public static void main(String[] args) {
		HibernateDemoManyToMany demoManyToMany = new HibernateDemoManyToMany();
		Session session = demoManyToMany.getSession();
		//保存;
		demoManyToMany.savePerson(session);
		
		//查询;
		demoManyToMany.queryPerson(session);
	}
	
	private void queryPerson(Session session){
		//Person_FK_Many_to_Many personFKManyToMany = (Person_FK_Many_to_Many) session.load(Person_FK_Many_to_Many.class, 1);
		String hql = "select p from Person_FK_Many_to_Many p";
		Query query = session.createQuery(hql);
		List<Person_FK_Many_to_Many> list = query.list();
		
		for(Person_FK_Many_to_Many personFKManyToMany:list){
			System.out.println(personFKManyToMany.getId()+","+personFKManyToMany.getName()+","+personFKManyToMany.getAge());
			Set<Address_FK_Many_to_Many> addressFKManyToManies = personFKManyToMany.getAddressFKManyToManieSet();
			for (Address_FK_Many_to_Many addressFKManyToMany : addressFKManyToManies) {
				System.out.println(addressFKManyToMany.getAddressID()+","+addressFKManyToMany.getAddressDetail());
			}
		}
		
		session.close();
		
		System.out.println(list.get(0).getAddressFKManyToManieSet().size());
	}
	
	private void savePerson(Session session){
		Person_FK_Many_to_Many fkManyToMany1 = new Person_FK_Many_to_Many();
		fkManyToMany1.setAge(22);
		fkManyToMany1.setName("ZhouHaiTao");
		
		Person_FK_Many_to_Many fkManyToMany2 = new Person_FK_Many_to_Many();
		fkManyToMany2.setAge(23);
		fkManyToMany2.setName("ZhangSan");
		
		Address_FK_Many_to_Many addressFKManyToMany1 = new Address_FK_Many_to_Many();
		addressFKManyToMany1.setAddressDetail("北京市朝阳区");
		
		Address_FK_Many_to_Many addressFKManyToMany2 = new Address_FK_Many_to_Many();
		addressFKManyToMany2.setAddressDetail("深圳市罗湖区");
		
		Address_FK_Many_to_Many addressFKManyToMany3 = new Address_FK_Many_to_Many();
		addressFKManyToMany3.setAddressDetail("长沙市雨花区");
		
		fkManyToMany1.getAddressFKManyToManieSet().add(addressFKManyToMany1);
		fkManyToMany1.getAddressFKManyToManieSet().add(addressFKManyToMany2);
		
		fkManyToMany2.getAddressFKManyToManieSet().add(addressFKManyToMany2);
		fkManyToMany2.getAddressFKManyToManieSet().add(addressFKManyToMany3);
		
		session.beginTransaction().begin();
		//保存Peron第一个对象;
		session.save(fkManyToMany1);
		
		//保存Person第二个对象;
		session.save(fkManyToMany2);
		session.beginTransaction().commit();
	}
}

 

 

控制输出入如下:
1,ZhouHaiTao,22
1,深圳市罗湖区
2,北京市朝阳区


2,ZhangSan,23
1,深圳市罗湖区
3,长沙市雨花区

 

分享到:
评论

相关推荐

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射可以通过 `&lt;many-to-one&gt;` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml &lt;id name="id" column="id" type="java.lang.Integer"&gt;...

    hibernate 全面学习->hibernate 关联映射学习

    `hibernate_one2many_1`和`hibernate_one2many_2`的示例可能分别展示了单向和双向的一对多映射。单向映射意味着只有父类知道子类的存在,而双向则允许双方相互引用。在配置中,这通常涉及到`@OneToMany`注解的使用,...

    Hibernate关联映射

    在 Hibernate 中,一对一的外键单向关联意味着一个实体类中的属性指向另一个实体类,而另一个实体类并不知道这个关联。这种关联可以通过在 `many-to-one` 元素中添加 `unique="true"` 属性实现。例如,在 Person 类...

    hibernate实体关联关系映射

    ### Hibernate实体关联关系映射详解 #### 一、引言 Hibernate作为一种强大的对象关系映射(Object Relational Mapping,简称ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了持久化层的开发工作,...

    hibernate的关联映射

    关联映射主要包括四种类型:一对一(One-to-One)、一对多(One-to-Many)、多对一(Many-to-One)和多对多(Many-to-Many)。下面我们将逐一探讨这些关联映射的配置方法。 1. **一对一关联映射** - **主键关联**...

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    Hibernate关联映射.doc

    ### Hibernate关联映射详解 #### 一、单向多对一映射 在单向多对一的关系中,主要是指“多方”实体依赖于“一方”实体,但是“一方”实体并不感知到“多方”的存在。 1. **数据库设计:**在多方的表中添加与一方...

    Hibernate关联关系映射目录

    在一对多外键单向关联中,一个实体(父实体)与多个实体(子实体)相关联,这种关联通过在子实体中添加一个指向父实体的外键来实现。 **表结构示例**: - **Department表**: - `departmentid`: 主键 - `...

    Hibernate 一对多外键单向关联

    在Java持久化框架Hibernate中,一对多外键单向关联是一种常见的关系映射方式,它描述了一对多的关系,其中一个实体(例如Person)可以与多个其他实体(例如Address)相关联,而关联的方向只从多方(Address)指向...

    hibernate关联映射

    hibernate关联映射是Hibernate框架中的一个重要概念,它用于在Java对象模型和数据库表之间建立关系,使得数据操作更加方便。以下将详细介绍各种类型的关联映射: 1. **单向N-1关联(无连接表)** 在这种关联中,一...

    Hibernate一对多单向关联映射

    `&lt;key&gt;`元素定义了外键列名,`&lt;one-to-many&gt;`元素指定被关联的实体类。 三、实体类定义 在Department实体类中,需要有一个类型为Set的属性,对应映射文件中的`&lt;set&gt;`元素。 ```java public class Department { //...

    myeclipse试用小记----Hibernate多对一单向关联(1)

    3. **映射文件**:如果使用传统的Hibernate XML映射文件,需要在`.hbm.xml`文件中配置多对一关联,设置`&lt;many-to-one&gt;`标签。如果是注解方式,直接在Java类中使用上述提到的注解。 4. **数据访问对象(DAO)**:...

    Hibernate关联关系.doc

    在Java持久化框架Hibernate中,关联关系映射是核心特性之一,它允许对象模型与数据库中的关系模型对应。本文将详细解析三种基本的关联关系:多对一、一对多以及一对一,以及它们在Hibernate中的配置。 1. **多对一...

    Hibernate中的关联映射

    根据描述,本文将详细介绍Hibernate中的各种映射关系,包括单向和双向的关联,以及不同类型的关联方式如一对一、一对多、多对多等,以帮助初学者更好地理解和应用这些概念。 #### 二、关联映射类型 ##### 2.1 单向...

    hibernate的关联关系映射

    【hibernate的关联关系映射】在Java持久化框架Hibernate中,关联关系映射是核心功能之一,它允许对象间的复杂关系与数据库中的表结构相匹配。在选课系统这个例子中,主要涉及到的对象包括课题(Course)、教师(Teacher...

    Hibernate_Annotation关联映射

    和其它许多批注一样,在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+...

    hibernate单向多对多映射(XML版)

    `&lt;key&gt;`元素指定了`Student`的外键列,`&lt;many-to-many&gt;`元素则指定了`Course`的外键列和关联的实体类。 在`Course`的映射文件中,因为是单向映射,所以不需要额外的配置。不过,如果需要双向映射,`Course`也需要...

    HibernateAPI中文版.chm

    6.2.4. 值集合于多对多关联(Collections of values and many-to-many associations) 6.2.5. 一对多关联(One-to-many Associations) 6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合...

Global site tag (gtag.js) - Google Analytics