您的位置:首页 > 其它

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

2017-03-27 16:57 417 查看
  一对多关联映射

  映射原理

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

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



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

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外键里面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hiberspan idtransmar