hibernate学习 关联映射(多对一,一对多)

  一对多关联映射

  映射原理

  一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。

  多对一关联是最常见的单向关联关系,如:多个用户属于同一个组,多个学生处于同一个班级。之所以叫他多对一而不是一对多,是因为他们之间的关系是多的一方来维护的,下面我们就以多个用户属于同一个组来详细说明一下单向多对一。首先看一下他们的关系示例:



  从上边的图示中可以看出,多个用户属于一个组,我们用多的一方来维护,所以我们可以根据用户可以知道他在哪个组,而不需要知道一个组里有哪些用户,这就是所谓的单向的。多对一映射原理:在多的一端加入一个外键指向一的一端,它维护的关系多指向一,一对多映射原理,在多的一端加入一个外键指向一的一端,她维护的关系是一指向多,也就是说一对多与多对一的映射原理是一样的,只是站的角度不一样。下面来看一下单向多对一关系配置文件:

Group实体是普通的一方,不需要维护.

<?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="com.hyxd.entity">
	<class name="Group" table="group">
		<id name="id">
			<generator class="native"></generator>
		</id>
		<property name="name" type="string"></property>
	</class>
</hibernate-mapping>

User实体  多端,这里需要创建一个外键来维护User的关系,

public class User {
	private int id;
	private String name;
	private Group group;
}
User.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="com.hyxd.entity">
	<class name="User" table="user">
		<id name="id" column="u_id">
			<generator class="native"></generator>
		</id>
		<property name="name" type="string" column="uName"></property>
		<!-- 
			多对一映射配置
			映射关键点:
			1.  映射的属性  :  dept
			2.  映射的属性,对应的外键字段: dept_id
			3.  类型
		 -->
		<many-to-one name="group" column="g_id" class="Group"></many-to-one>
	</class>
</hibernate-mapping>

注:1.many-to-one 元素的常用属性:



多对一关联映射

映射原理

在多端维护一个外键字段,指向一的一端,通过多端来维护

User.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="com.hyxd.entity">
	<class name="User" table="user">
		<id name="id" column="u_id">
			<generator class="native"></generator>
		</id>
		<property name="name" type="string" column="uName"></property>
	</class>
</hibernate-mapping>

Group

public class Group {
	private int id;
	private String name;
	private Set<User> user;
}
Group.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="com.hyxd.entity">
	<class name="Group" table="group">
		<id name="id" column="g_id">
			<generator class="native"></generator>
		</id>
		<property name="name" type="string"></property>
		<!-- 
			一对多关联映射配置  (通过组管理到用户)
			Group 映射关键点:
			1.  指定 映射的集合属性
			2.  集合属性对应的集合表
			inverse=false  set集合映射的默认值; 表示有控制权
		 -->
		<set name="user" table="user" inverse="true" cascade="save-update,delete">
			<!-- 3.  集合表的外键字段  -->
			<key column="groud_id"></key>
			<!-- 4.  集合元素的类型 -->
			<one-to-many class="User"/>
		</set>
	</class>
</hibernate-mapping>

下面是多对一的运行结果:



@Test
	public void save2() {
		Session session = sf.openSession();
		session.beginTransaction();
		Group group = new Group();
		group.setGroupName("管理员");
		User user1= new User();
		user1.setName("Jack");
		User user2= new User();
		user2.setName("Tom");
		user1.setGroup(group);
		user2.setGroup(group);
		// 保存
		session.save(group); // 先保存一的方法
		session.save(user1);
		session.save(user2);// 再保存多的一方,关系回自动维护(映射配置完)
		session.getTransaction().commit();
		session.close();
	}
这里主要是要把,Group这个属性的ID,保存到User外键里面


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值