Hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的。一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它。
今天就来说说多对一的关联映射。
数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系。比如用户和用户组,一个用户只属于一个组,一个组有多名用户。我们就可以说用户和用户组的关系就是多对一的关系。用对象的uml图表示一下:
在Hibernate中如何来实现呢?首先定义这两个实体类:
package com.bjpowernode.hibernate;
/**
* 用户组
* @author Longxuan
*
*/
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;
}
}
package com.bjpowernode.hibernate;
/**
* 用户类
* @author Longxuan
*
*/
public class User {
private int id;
private String name;
private Group group;
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.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;
}
}
hibernate.cfg.xml配置文件:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory name="foo">
<property name="hibernate.dialect" >org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property><!-- 设置是否显示生成sql语句 -->
<property name="hibernate.format_sql">false</property><!-- 设置是否格式化sql语句-->
<mapping resource="com/bjpowernode/hibernate/Tables.hbm.xml" />
</session-factory>
</hibernate-configuration>
hibernate.properties配置文件:
## MySQL
hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql://localhost:3306/hibernate_many2one
hibernate.connection.username root
hibernate.connection.password root
这是最基础的准备工作,多对一映射在对数据进行更改时,会有一些限制。当没有该用户组时,添加用户,就会出错,当该用户组有用户时,删除该用户组也会报错。
我们当然可以按一般的方法来做。添加的时候,先手动添加组,再添加用户。删除时,先删除所有的用户,再删除用户组。但是Hibernate为我们提供了一种便捷的方式——many-to-one。在映射文件hbm.xml中配置后,就可以不用再想那些限制了。Hibernate会自动添加上所引用的数据。
给出映射文件:
<?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" table="t_user">
<id name="id">
<generator class="native" />
</id>
<property name="name"></property>
<many-to-one name="group" column="groupid" cascade="save-update"></many-to-one>
</class>
<class name="com.bjpowernode.hibernate.Group" table="t_group">
<id name="id">
<generator class="native" />
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
配置了many-to-one会自动在t_user表中创建外键groupid,与t_group的id映射。
测试类Many2OneTest:
package com.bjpowernode.hibernate;
import junit.framework.TestCase;
import org.hibernate.Session;
public class Many2OneTest extends TestCase {
/**
* 测试添加用户
*/
public void testSave3(){
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);
//普通方法 :必须先保存group,再保存user
//配置了many-to-one 则不用再手动save group了。
//session.save(group);
session.save(user1);
session.save(user2);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
结果图:
执行测试前:
, 执行测试后:
用many-to-one进行配置后,hibernate会自动去添加外键,而我们做的任何操作都不需要去考虑它的结构,也不用手动去维护这个关系,关系由Hibernate自动维护。这就是Hibernate的魅力所在。
分享到:
相关推荐
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
Hibernate 多对一外键单向关联 Hibernate 多对一连接表单向关联 Hibernate 多对多单向关联 Hibernate 一对一外键双向关联 Hibernate 一对一主键双向关联 Hibernate 一对一连接表双向关联 Hibernate 一对多外键双向...
hibernate单向一对多关联映射(注解版)
这里包含了hibernate多对一单向关联关系实现源码,希望对你有用。
hibernate单向多对多映射(XML版)
NULL 博文链接:https://lijunabc.iteye.com/blog/438173
│ ├─ 多对一外键单向关联 │ ├─ 多对一连接表单向关联 │ └─ 多对多单向关联 └─双向关联 ├─ 一对一外键双向关联 ├─ 一对一主键双向关联 ├─ 一对一连接表双向关联 ├─ 一对多外键双向关联 ├─ 一对...
NULL 博文链接:https://1028826685.iteye.com/blog/1536060
Hibernate学习:单向多对一关联 工程
Hibernate映射一对多关联关系
Hibernate双向一对一关联映射(注解版)
hibernate关联映射注解多对多单向关联、
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
博文链接:https://shaqiang32.iteye.com/blog/201308
hibernate关联映射详解SSH 多对多,一对多关系对象映射
hibernate主键实现一对一单向关联关系源码
hibernate单向多对多映射(注解版)
Hibernate 4——Hello World
1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1:一对多和多对一映射,举例说明: 学生和老师: 一个老师可以教多个学生 【一对多映射】 多个学生可以被一个老师教【多对一映射】 部门与员工: ...
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了