【Hibernate】——多对一映射

          什么是映射?


           小编这里总结一年Hibernate的关联映射,这篇博文主要讲多对一的关联映射。

           首先要知道什么是映射?简单的说,一个萝卜一个坑就是一种映射关系。数学上来说,y = ax^2 + bx + c,就

是x到y 的映射。


           Hibernate的基本映射?


           而hibernate的基本映射是指:一个类(class)对应一个实体。在映射文件中,实体的标识字段用<id>,

generator指主键的生成策略,常用的有:native、uuid、assigned、identity、sequence、foreign;普通属性字段用

<property>,如下:

<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Role" table="t_role">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>			
	</class>
</hibernate-mapping>

            除此之外我们还需要掌握实体类的设计原则:

            1、实现无参的默认构造函数

            2、提供一个标识(一般为id)

            3、不要使用final修饰实体类

            4、为实体类生成getter和setter方法

            下边进入正题了~


             对象关联映射?

    

            关联映射是指将关联关系映射到数据库中,在对象模型中就是一个或多个引用。对象的关联映射分为:多对

一(一对多)、一对一、多对多。今天我们主要讲多对一的情况。

           

            多对一关联映射


            多对一映射原则:在多的一端加入一个外键,指向一的一端,如图:


             一个组里有多个用户,所以在用户表里加入一个外键groupid。

             新建Group实体类:

package com.bjpowernode.hibernate;
/**
 * 建立Group实体类
 * @author why_768
 *
 */
public class Group {
	private int id;
	
	private String name;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}

              新建User实体类:

package com.bjpowernode.hibernate;
/**
 * 建立User实体类
 * @author why_768
 *
 */
public class User {
	private int id;
	private String name;
	private Group group;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Group getGroup() {
		return group;
	}
	public void setGroup(Group group) {
		this.group = group;
	}
		
}
 
               接下来新建实体类对应的映射文件,Group.hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Group" table="t_group">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>		
	</class>
</hibernate-mapping>

              User.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.bjpowernode.hibernate.User">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <many-to-one name="group" column="groupid" cascade="save-update"/>
    </class>
</hibernate-mapping>

              看到User.hbm.xml文件里的<many-to-one>就是多对一的标识,column指对group进行重命名,这个groupid

会在数据库中有对应的字段,cascade(级联)是对多一关系中的重要属性,它是对象之间的连锁操作,只影响添

加、删除和修改,对查询时没有影响的。cascade主要属性有:

             1、all:在所有的情况下都执行级联操作,这里的所有指:增、删、改三种情况下。

             2、none:在所有情况下都不执行级联操作。

             3、save-update:保存和更新时执行级联操作。

             4、delete:仅在删除操作时执行级联操作。


             下边用Junit写测试类:

      public void testSave1(){
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			
			Group group = new Group();
			group.setName("动力节点");
			
			User user1=new User();
			user1.setName("张三");
			user1.setGroup(group);
			
			User user2=new User();
			user2.setName("李四");
			user2.setGroup(group);
			
			session.save(user1);
			session.save(user2);
			
			session.getTransaction().commit();
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		} finally{
			HibernateUtils.closeSession(session);
		}
	}
               控制台输出如下语句:

Hibernate: insert into t_group (name) values (?)
Hibernate: insert into User (name, groupid) values (?, ?)
Hibernate: insert into User (name, groupid) values (?, ?)

             查数据库,数据已经保存到数据库了:



            多对一的关系相对来说还是比较简单的,下一篇博客说下多对一的反例:一对多关联关系的实现。

 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值