【hibernate】<第二节>hibernate的一对多映射(基本类型)
所需工具与前文一致!
第一部分内容:基本类型的一对多(one to many)
以部门表与员工表为例:
目录结构:

hibernate.cfg.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<!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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 配置数据库的别名 -->
<!-- 什么是别名?大家都知道hibernate一个重要的优点是可以跨数据库使用,实现这点的原因就在这里,hibernate为每种常见的数据库都
实现了特定的sql语句,比如就分页来说,mysql就是limit语句,而oracle就是恶心的多个select嵌套在一起,但是hibernate本身不
能识别数据库的类型,在这里我们通过设置别名来告诉hibernate使用什么数据库的语句来实现
不同数据库的别名分别是什么?
hibernate的包里有一个是常用配置文件,从这里可以查到
Hiberante开发包__hibernate-distribution-3.6.0.Final-dist\hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 配置数据库的url地址 -->
<property name="hibernate.connection.url">jdbc:mysql:///test</property>
<!-- 配置数据库的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 配置数据库的密码 -->
<property name="hibernate.connection.password">root</property> <!-- 非必须配置 -->
<!-- 是否在控制台打印sql语句,建议开发时打开,发布后关闭 -->
<property name="show_sql">true</property>
<!-- 格式化控制台打印的sql语句 -->
<!--<property name="format_sql">true</property> -->
<!-- hibernate有两种开发流程,一个是先在数据库里建好库,建好表,再写对应的实体类,与对应关系。另一种是按需求直接写实体类与对应关系,再通过hibernate自动
生成对应的数据库里的表。如果想自动生成表就要配置这个hbm2ddl.auto这个属性了,这个属性有好几个值,一般用update,其余的查文档吧
-->
<property name="hbm2ddl.auto">update</property> <!-- 添加映射文件 -->
<!-- <mapping resource="cn/kiwifly/entity/User.hbm.xml"/> -->
</session-factory>
</hibernate-configuration>
两个实体类:
Department.java
package cn.kiwifly.entity; import java.util.HashSet;
import java.util.Set; public class Department { private Integer id;
private String name;
private Set<Employee> employees = new HashSet<>(); public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Set<Employee> getEmployees() {
return employees;
} public void setEmployees(Set<Employee> employees) {
this.employees = employees;
} public String toString() {
return "Department [id=" + id + ", name=" + name + ", employees="
+ employees + "]";
} }
Employee.java
package cn.kiwifly.entity;
public class Employee {
private Integer id;
private String name;
private Integer age;
private Department department;
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", age=" + age
+ ", department=" + department.getName() + "]";
}
}
两个实体类的配置文件:
department.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.kiwifly.entity">
<class name="Department" table="t_department">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="name" column="name" type="string"/>
<set name="employees" table="t_employee" inverse="true">
<key column="department_id" />
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
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.kiwifly.entity">
<class name="Employee" table="t_employee">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<property name="age" column="age" type="integer" />
<many-to-one name="department" column="department_id" class="Department" />
</class>
</hibernate-mapping>
hibernate 一对多映射格式
|
类型 |
特点 |
映射格式 |
|
Set |
无序,不重复 |
<set name=”主表中一对多的属性“ table=”集合表”> <key column=”集合表外键” /> <element type=”字段类型” column=”字段名”> </set> |
|
List |
有序,可重复 |
<list name=”主表中一对多的属性“ table=”集合表”> <key column=”集合表外键” /> <list-index column=”排序序列”/> <element type=”字段类型” column=”字段名”> </list> |
|
Array |
有序,可重复(同List) (因不能动态增长,所以不常用) |
<array name=”主表中一对多的属性“ table=”集合表”> <key column=”集合表外键” /> <list-index column=”排序序列”/> <element type=”字段类型” column=”字段名”> </array> (与List基本一样) |
|
Bag |
有序,可重复 (hibernate特有对象) |
<bag name=”主表中一对多的属性“ table=”集合表”> <key column=”集合表外键” /> <element type=”字段类型” column=”字段名”> </bag> (与Set基本一样) |
|
Map |
键值对,无序,Key不可重复 |
<map name=”主表中一对多的属性“ table=”集合表”> <key column=”集合表外键” /> <map-key type=”类型” column=”键字段”></map-key> <element type=”字段类型” column=”字段名”> </map> |
一些细节问题:
1、写类的toStirng()方法的时候要注意,如果只是有eclipse的快捷键复写,可能会出现栈溢出的异常,因为eclipse的复写只是写了类名,因为这里的相互引用会出现死循环
2、以上重点在set的映射,其余的都是在其基础上映射的
3、List与Array与Set相比多了一个list-index属性,就是这个属性来让list变的有序,这么就引出一个问题;数据库如何保证数据的有序性哪?
hibernate的作法:设置一个索引字段;用以保存顺序;
4、set有两个重要的属性inverse与cascade这里没说,但很重要,有很多博客说的很详细,可以看看
【hibernate】<第二节>hibernate的一对多映射(基本类型)的更多相关文章
- 第二节 hibernate session介绍以及session常用方法介绍
原创地址:http://www.cnblogs.com/binyulan/p/5628579.html Session是java应用程序和hibernate框架之间的一个主要接口.它是从持久化服务中剥 ...
- Hibernate学习6—Hibernate 映射类型
第一节:基本类型映射 com.cy.model.Book.java: package com.cy.model; import java.sql.Blob; import java.util.Date ...
- 面试题:hibernate 第二天 快照 session oid 有用
## Hibernate第二天 ## ### 回顾与反馈 ### Hibernate第一天 1)一种思想 : ORM OM(数据库表与实体类之间的映射) RM 2)一个项目 : CRM 客户关系管理系 ...
- 【hibernate】<第一节>hibernate简单入门
所需工具: ide:eclipse or myeclipse jdk:1.7 jar包:hibernate-distribution-3.6.0.Final 和对应mysql的驱动类(对应jar包如图 ...
- 第一节 Hibernate 基本配置
1 新建maven工程 1)打开eclipse,依次点击File---->New---->Maven Project. 2)选择org.apache.maven.archetypes ma ...
- hibernate第二天
hibernate的核心思想就是将之前对单个字段的操作变为操作一个对象,使用了ORM(Object relation mapping)对象关系映射的思想 · 在hibernate中对数据库特殊字段的有 ...
- Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装
Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装 你们可以直接去,http://blog.csdn.net/wei_chong_chong/ar ...
- Hibernate 系列 02 - Hibernate介绍及其环境搭建
引导目录: Hibernate 系列教程 目录 昨晚喝多了,下午刚清醒,继续搞Hibernate.走起. 觉得还行的话,记得点赞哈,给我这个渣渣点学习的动力.有错误的话也请指出,省的我在错误上走了不归 ...
- Hibernate(一)之Hibernate入门
一.Hibernate入门 ssh框架体系结构 1.1.ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational ...
随机推荐
- 怎样高效地去判断Array中是否包含某个值?
问题 怎样去判断Array(无序)中是否包含某个值呢? 这是一个在Java中经常被问到的问题.它也是Stack Overflow上投票前几的一个问题.下面将展示投票前几的几个回答,这些回答使用不同的方 ...
- mybatis3批量更新 批量插入
在公司ERP项目开发中,遇到批量数据插入或者更新,因为每次连接数据库比较耗时,所以决定改为批量操作,提升效率.库存盘点导入时,需要大量数据批量操作. 1:数据库连接代码中必须开启批量操作.加上这句,& ...
- 存放事务码及其描述的TABLE是TSTC、TSTCT。
存放事务码及其描述的TABLE是TSTC.TSTCT.
- ArcObject10.1降级至10.0
最开始接触ArcGIS版本是9.3,为了需要也安装了9.2进行开发:因为自己的电脑配置较低,所以跑不起10.0中文版:毕业工作后,行业内用10.1居多(虽然10.3已出):现在10.4都要出来了:由于 ...
- 在 SharePoint 2013 中配置 Office Web Apps
原文发布于 2012 年 7 月 23 日(星期一) 如您所知或您即将知道,SharePoint 2013 中的 Office Web Apps 不再是 SharePoint 场中的服务应用程序.相反 ...
- 2015年第8本(英文第7本):the city of ember 微光城市
书名:the City of Ember(中文名:微光城市) 作者:Jeanne DuPrau 单词数:6.2万 不重复单词数:未知 首万词不重复单词数:未知 蓝思值:未知 阅读时间:2015年4月2 ...
- iOS之 随笔-静态库创建Xcode7
不多说直接上图 然后你就可以找到你的.a文件了还有你的头文件 在终端可以检查你所编译的静态库都支持什么架构(armv7,armv7s ,arm64)用这个命令 lipo -info 编译时候要看你Xc ...
- 二维码扫描利用ZBar实现
上次是根据系统的属性自己封装的一个二维码扫描,这次给大家介绍一下基于ZBar集成的类似于QQ二维码扫描界面的二维码扫描的效果. ...
- Sonar代码质量管理工具
最近上线了,Sonar代码扫描工具: 与jenkins集成: 实现自动扫描: 下面来简单聊聊Sonar能解决什么问题: ---------------------- Sonar简介 Sonar是一个用 ...
- JMeter源码集成到Eclipse
由于JMeter纯Java开发,界面也是基于Swing或AWT搞出来的,所以想更深层次的去了解这款工具或对于想了解JMeter插件开发或二次开发的童鞋们来说,读读JMeter的源码估计是必不可少的,所 ...