Hibernate的一对一映射
一、创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql、Oracle、SqlServer等)的Jar包,创建 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="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- <property name="connection.url">jdbc:mysql:///mis</property> -->
<property name="connection.url">
<!-- 解决Mysql插入中文乱码的问题 -->
<![CDATA[jdbc:mysql://localhost:3306/mis?useUnicode=true&characterEncoding=utf8]]>
</property> <!-- 配置 hibernate 的基本信息 -->
<!-- hibernate 所使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> <!-- 执行操作时是否在控制台打印 SQL -->
<property name="show_sql">true</property> <!-- 是否对 SQL 进行格式化 -->
<property name="format_sql">true</property> <!-- 指定自动生成数据表的策略 -->
<property name="hbm2ddl.auto">update</property> <!-- 设置 Hibernate 的事务隔离级别 :读已提交的记录-->
<property name="connection.isolation"></property> <!-- 删除对象后, 使其 OID 置为 null -->
<property name="use_identifier_rollback">true</property> <!-- 配置 C3P0 数据源 -->
<property name="hibernate.c3p0.max_size"></property>
<property name="hibernate.c3p0.min_size"></property>
<property name="c3p0.acquire_increment"></property> <property name="c3p0.idle_test_period"></property>
<property name="c3p0.timeout"></property> <property name="c3p0.max_statements"></property> <!-- 设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数 -->
<property name="hibernate.jdbc.fetch_size"></property> <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 -->
<property name="jdbc.batch_size"></property> <!-- 指定关联的 .hbm.xml 文件 -->
<!--
<mapping resource="com/mcs/hibernate/entities/News.hbm.xml" />
<mapping resource="com/mcs/hibernate/entities/Worker.hbm.xml" /> <mapping resource="com/mcs/hibernate/entities/n21/Customer.hbm.xml" />
<mapping resource="com/mcs/hibernate/entities/n21/Order.hbm.xml" />
--> <mapping resource="com/mcs/hibernate/entities/n21/both/Customer.hbm.xml" />
<mapping resource="com/mcs/hibernate/entities/n21/both/Order.hbm.xml" /> </session-factory> </hibernate-configuration>
二、基于外键的一对一映射
1、创建Java实体类
package com.mcs.hibernate.entities.onetoone.foreign; public class Department { private Integer departmentId;
private String departmentName; private Manager manager; public Integer getDepartmentId() {
return departmentId;
} public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
} public String getDepartmentName() {
return departmentName;
} public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
} public Manager getManager() {
return manager;
} public void setManager(Manager manager) {
this.manager = manager;
} }
package com.mcs.hibernate.entities.onetoone.foreign; public class Manager { private Integer managerId;
private String managerName; private Department department; public Integer getManagerId() {
return managerId;
} public void setManagerId(Integer managerId) {
this.managerId = managerId;
} public String getManagerName() {
return managerName;
} public void setManagerName(String managerName) {
this.managerName = managerName;
} public Department getDepartment() {
return department;
} public void setDepartment(Department department) {
this.department = department;
} }
2、根据实体类创建对应的 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">
<!-- Generated -- :: by Hibernate Tools 3.5..Final -->
<hibernate-mapping>
<class name="com.mcs.hibernate.entities.onetoone.foreign.Department" table="DEPARTMENTS">
<id name="departmentId" type="java.lang.Integer">
<column name="DEPARTMENT_ID" />
<generator class="native" />
</id>
<property name="departmentName" type="java.lang.String">
<column name="DEPARTMENT_NAME" />
</property> <!-- 使用 many-to-one 的方式来映射 - 关联关系 -->
<many-to-one name="manager"
class="com.mcs.hibernate.entities.onetoone.foreign.Manager"
column="MANAGER_ID"
unique="true"></many-to-one>
</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">
<!-- Generated -- :: by Hibernate Tools 3.5..Final -->
<hibernate-mapping>
<class name="com.mcs.hibernate.entities.onetoone.foreign.Manager" table="MANAGERS">
<id name="managerId" type="java.lang.Integer">
<column name="MANAGER_ID" />
<generator class="native" />
</id>
<property name="managerName" type="java.lang.String">
<column name="MANAGER_NAME" />
</property> <!-- 映射 - 的关联关系: 在对应的数据表中已经有外键了, 当前持久化类使用 one-to-one 进行映射 -->
<!--
没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
-->
<one-to-one name="department"
class="com.mcs.hibernate.entities.onetoone.foreign.Department"
property-ref="manager">
</one-to-one>
</class>
</hibernate-mapping>
注:
1、在有外键的一端需要使用many-to-one元素,该元素使用 unique="true" 属性来约束唯一值,并指定外键栏 column="MANAGER_ID"
2、没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
3、在保存操作中,建议先保存没有外键列的那个对象. 这样会减少 UPDATE 语句
4、默认情况下对关联属性使用懒加载,注意可能会出现懒加载异常的问题。
5、在查询没有外键的实体对象时, 使用的左外连接查询, 一并查询出其关联的对象,并已经进行初始化。
三、基于主键的一对一映射
1、创建Java实体类
package com.mcs.hibernate.entities.onetoone.primary; public class Department { private Integer departmentId;
private String departmentName; private Manager manager; public Integer getDepartmentId() {
return departmentId;
} public void setDepartmentId(Integer departmentId) {
this.departmentId = departmentId;
} public String getDepartmentName() {
return departmentName;
} public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
} public Manager getManager() {
return manager;
} public void setManager(Manager manager) {
this.manager = manager;
} }
package com.mcs.hibernate.entities.onetoone.primary; public class Manager { private Integer managerId;
private String managerName; private Department department; public Integer getManagerId() {
return managerId;
} public void setManagerId(Integer managerId) {
this.managerId = managerId;
} public String getManagerName() {
return managerName;
} public void setManagerName(String managerName) {
this.managerName = managerName;
} public Department getDepartment() {
return department;
} public void setDepartment(Department department) {
this.department = department;
} }
2、根据实体类创建对应的 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">
<!-- Generated -- :: by Hibernate Tools 3.5..Final -->
<hibernate-mapping>
<class name="com.mcs.hibernate.entities.onetoone.primary.Department" table="DEPARTMENTS">
<id name="departmentId" type="java.lang.Integer">
<column name="DEPARTMENT_ID" />
<!-- 使用外键的方式来生成当前的主键 -->
<generator class="foreign" >
<!-- property 属性指定使用当前持久化类的哪一个属性的主键作为外键 -->
<param name="property">manager</param>
</generator>
</id>
<property name="departmentName" type="java.lang.String">
<column name="DEPARTMENT_NAME" />
</property> <!--
采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,
其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束
-->
<one-to-one name="manager"
class="com.mcs.hibernate.entities.onetoone.primary.Manager"
constrained="true">
</one-to-one>
</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">
<!-- Generated -- :: by Hibernate Tools 3.5..Final -->
<hibernate-mapping>
<class name="com.mcs.hibernate.entities.onetoone.primary.Manager" table="MANAGERS">
<id name="managerId" type="java.lang.Integer">
<column name="MANAGER_ID" />
<generator class="native" />
</id>
<property name="managerName" type="java.lang.String">
<column name="MANAGER_NAME" />
</property> <one-to-one name="department"
class="com.mcs.hibernate.entities.onetoone.primary.Department">
</one-to-one>
</class>
</hibernate-mapping>
注:
1、其中一端会使用另外一端的主键做为主键,另外一端代码采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束。
2、在保存操作中,建议先保存没有外键列的那个对象. 这样会减少 UPDATE 语句
3、默认情况下对关联属性使用懒加载,注意可能会出现懒加载异常的问题。
Hibernate的一对一映射的更多相关文章
- hibernate中一对一映射
一.hibernate中一对一映射有两种 1 主键方式,一张表的主键是通过另一张表的主键生成的 2 外键方式,一张表添加外键引用另一张表的主键,并添加唯一unique约束 二.下面进行简单例子,用户和 ...
- 9.hibernate的一对一映射
一.hibernate的一对一按照外键映射 1.创建如下sql脚本: --员工账号表 create table USERS1 ( USERID ) not null, USERNAME ), USER ...
- Hibernate(七)一对一映射
一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname ), --班级名称 gdesc ) --班级介绍 ); ...
- Hibernate表关系映射之一对一映射
一.数据表的映射关系 在数据库领域中,数据表和数据表之间关系一般可以分为如下几种: 一对一:比如公民和身份证的关系,一个人只有一张身份证,同时每张身份证也仅仅对应一个人! 一对多:比如客户和订单之间的 ...
- hibernate笔记--基于主键的单(双)向的一对一映射关系
上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这 ...
- hibernate笔记--基于外键的单(双)向的一对一映射关系
假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...
- Hibernate一对一映射关联
Hibernate提供了两种一对一映射关联关系的方式: 1)按照外键映射 2)按照主键映射 下面以员工账号表和员工档案表(员工账号和档案表之间是一对一的关系)为例,介绍这两种映射关系,并使用这两种 映 ...
- Hibernate中的一对一映射
1.需求 用户和身份证是一一对应的关系. 有两种对应方式: 用户id作为身份证表的外键,身份证号作为主键: 用户id作为身份证表的主键: 2.实体Bean设计 User: public class U ...
- 【Hibernate 3】一对一映射配置
一.一对一映射简介 一对一关联映射有两种实现策略: 第一种:主键关联,即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系:数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联 ...
随机推荐
- bzoj3505: [Cqoi2014]数三角形 [数论][gcd]
Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和 ...
- NOIp2018集训test-9-19(am&pm)
AM 这是一套在长沙考过而且我能记得全部正解的题,然后期望得分300实际得分155. T1 很套路,随便搞(我当年是怎么花大半场时间写T1并且写出现在两倍长的代码的??) //Achen #inclu ...
- Notepad++如何对比文件 Notepad++对比两个文件代码方法
大家在使用Notepad++的时候,需要对编辑的两个文件进行比较,找出两个文件代码的区别,快速进行编辑修改,那么Notepad++如何对比文件,下面小编就给大家带来Notepad++对比两个文件代码方 ...
- HDU1285-确定比赛名次-拓扑排序板子题
有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...
- 转: div:给div加滚动条 div的滚动条设置
div 的滚动条问题: 两种方法: 一. <div style=" overflow:scroll; width:400px; height:400px;”></div&g ...
- SpringAOP中的注解配置
使用注解实现SpringAOP的功能: 例子: //表示这是被注入Spring容器中的 @Component //表示这是个切面类 @Aspect public class AnnotationHan ...
- 2018今日头条湖北省赛【A】
[题目链接]https://www.nowcoder.com/acm/contest/104/A 这题就是很简单的几何题..md现场推了很久的cos sin仿佛像个zz.自己都想给自己一巴掌. 题意就 ...
- 论文阅读笔记---ShuffleNet V1
01 ShuffleNet V1要解决什么问题 为算力有限的嵌入式场景下专门设计一个高效的神经网络架构. 02 亮点 使用了两个新的操作:pointwise group convolution和cha ...
- Spark Streaming的简单介绍
本文讲解Spark流数据处理之Spark Streaming.本文的写作时值Spark 1.6.2发布之际,Spark 2.0预览版也已发布,Spark发展如此迅速,请随时关注Spark Stream ...
- sparkStreaming的transformation和action详解
根据Spark官方文档中的描述,在Spark Streaming应用中,一个DStream对象可以调用多种操作,主要分为以下几类 Transformations Window Operations J ...