学习Hibernate是为了更方便的操作数据库,在数据库中的关系模型中存在多对一的关系,比方下图所看到的的员工和部门之间的关系,那么这样的关系在Hibernate中怎样映射呢?让我用一个小Demo来具体解说。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXV3ZW56aGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

建立映射分为下面几步:

1.设计domain对象Department、Employee,代码例如以下:

package cn.itcast.hibernate.domain;

public class Department {
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 cn.itcast.hibernate.domain;

public class Employee {
private int id;
private String name;
private Department depart; 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 Department getDepart() {
return depart;
}
public void setDepart(Department depart) {
this.depart = depart;
}
}

2.导入hibernate.jar和其依赖的包,jar包的下载地址在上面博客中已经提供。这里不再赘述。

3.编写Department.hbm.xml和Employee.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
package="cn.itcast.hibernate.domain">
<class name="Department" table="Department">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
<?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
package="cn.itcast.hibernate.domain">
<class name="Employee" table="Employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/> <many-to-one name="depart" column="depart_id"/>
</class>
</hibernate-mapping>

Employee.hbm.xml中的“many-to-one”部分是重点。通过它建立Department对象和Employee的关联关系。

4.编写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>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="hbm2ddl.auto">update</property> <mapping resource="com/entity/User.hbm.xml" />
<mapping resource="cn/itcast/hibernate/domain/Department.hbm.xml" />
<mapping resource="cn/itcast/hibernate/domain/Employee.hbm.xml" />
</session-factory>
</hibernate-configuration>

5.编写HibernateUtils类,主要用来完毕Hibernate初始化和提供一个获得Session的方法。代码实现例如以下:

package com.entity;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public final class HibernateUtil {
private static SessionFactory sessionFactory; private HibernateUtil(){
} static {
//解析配置文件,完毕Hibernate初始化
Configuration cfg=new Configuration();
cfg.configure();
//全部的信息在sessionFactory中都能够找到
sessionFactory=cfg.buildSessionFactory();
} public static SessionFactory getSesssionFactory(){
return sessionFactory;
} public static Session getSession(){
return sessionFactory.openSession();
}
}

6.编写Main方法。通过操作Department类和Employee类,向数据库中写入数据,代码实现例如以下:

package com.entity;

import org.hibernate.Session;
import org.hibernate.Transaction; import cn.itcast.hibernate.domain.Department;
import cn.itcast.hibernate.domain.Employee; public class Many2One { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
add();
} static Department add() {
Session s = null;
Transaction tx = null;
try {
Department depart = new Department();
depart.setName("depart name"); Employee emp = new Employee();
emp.setDepart(depart);
emp.setName("emp name"); s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(depart);
s.save(emp);
tx.commit();
return depart;
} finally {
if (s != null)
s.close();
}
}
}

让我们查看一下数据表的变化,效果图例如以下所看到的:



   通过上述方法。我们就能够轻松完毕多对一关系从关系模型到对象模型的映射,完美的体现了ORM的思想。

希望我的解说能帮助大家学习Hibernate。

深入浅出Hibernate(二)多对一关系映射的更多相关文章

  1. 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】

    一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...

  2. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  3. 菜鸟学习Hibernate——多对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...

  4. Hibernate学习笔记(五) — 多对多关系映射

    多对多关系映射 多对多建立关系相当于在第三张表中插入一行数据 多对多解除关系相当于在第三张表中删除一行数据 多对多改动关系相当于在第三张表中先删除后添加 多对多谁维护效率都一样.看需求 在实际开发过程 ...

  5. Hibernate自身一对多和多对多关系映射

    一对多关系映射大家都明白,关系双方都一个含有对方多个引用,但自身一对多很多同学都不明白什么意思,那么首先我就说明一下什么是自身一对多,其实也很好理解,自身一对多就是自身含有本身的多个引用,例如新闻类别 ...

  6. Hibernate学习第三天(2)(多对多关系映射)

    1.1.1      Hibernate多对多关系的配置 1.1.1.1   创建表 l   用户表 CREATE TABLE `sys_user` ( `user_id` bigint(32) NO ...

  7. Hibernate执行流程和关系映射

    一.Hibernate的执行流程 hibernate作为一个ORM框架,它封装了大量数据库底层的sql语句操作的方法,这样在执行hibernate的过程中理解hibernate的执行流程很有必要. 由 ...

  8. hibernate 中多对多关系对象集合的保存

    多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...

  9. Hibernate One-to-One Mappings 一对一关系映射

    Hibernate One-to-One Mappings 一对一关系映射 关键:一对一关系映射和多对一关系映射非常像.仅仅是unique 属性值为 true 样例:一个员工仅仅能有一个地址. Hib ...

  10. Java基础-SSM之mybatis一对多和多对一关系映射

    Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建customers表: ...

随机推荐

  1. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是 ...

  2. CSU2188: Substring

    Description FST 是一名可怜的 ACMer,他很强,但是经常 fst,所以 rating 一直低迷. 但是重点在于,他真的很强!他发明了一种奇特的加密方式,这种加密方式只有 ACMer ...

  3. <Redis> 入门五 持久化RBD/AOF

    RDB RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘(默认是 dump.rdb). 默认持久化机制,就是将内存中的数据以快照的方式写入二进制文件dump.rbd中. 触发快照的条件 ...

  4. 零基础入门学习Python(29)--文件:一个任务

    知识点 一个任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来: #record.txt文件内容: 小客服:小甲鱼,今天有客户问你有没有女朋友? 小甲鱼:咦?? 小客服:我跟她 ...

  5. 利用Merge into 改写Update SQL 一例

    前言 客户说,生产系统最近CPU使用率经常达到100%,请DBA帮忙调查一下. 根据客户提供的情况描述及对应时间段,我导出AWR,发现如下问题: 11v41vaj06pjd :每次执行消耗2,378, ...

  6. java使用ant.jar解压缩文件

    ant.jar下载地址http://ant.apache.org/bindownload.cgi 压缩文件代码: import org.apache.tools.ant.Project; import ...

  7. Tomcat8.0 JDK1.8 的详细配置 Win10

    官网下载 先安装JDK以及JRE 之后安装Tomcat jdk配置环境变量: 用户变量:path:C:\Program Files\Java\jdk1.8.0_161\bin     ( jdk安装的 ...

  8. 当java web项目部署到服务器上时,无法将图片等媒体文件保存到服务器的最终奥义

    今天,我在部署web项目至云服务器上(Tomcat8.0)时,突然发现我的应用,无法上传图片,视频等多媒体文件了,一再检查自己的代码逻辑没有问题之后,逐一排查,首先想到的就是看一下控制台打印的日志,日 ...

  9. 一次偶遇 IOException

    今天遇到了个挺有意思的事情,为了实现上传头像的功能,这是需要实现的功能,项目在本地跑起来且在本地 服务器(tomcat)也实现了头像上传,并把头像路径存入数据库,但是却在上传到线上服务器的时候死活存不 ...

  10. reactNative 打包那些事儿

    我们项目测试时一般是debug版本,打包上线,一般是release版本,所以在测试和打包时会走不同的方法,如上图所示. 在debug版本中,会走我们本地服务器,也就是自己电脑上的服务.在release ...