什么是映射?
小编这里总结一年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 (?, ?)
查数据库,数据已经保存到数据库了:
多对一的关系相对来说还是比较简单的,下一篇博客说下多对一的反例:一对多关联关系的实现。