Hibernate的一对一映射

一、创建Java工程,新建Lib文件夹,加入Hibernate和数据库(如MySql、Oracle、SqlServer等)的Jar包,创建 hibernate.cfg.xml 文件,并配置,配置项如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6     <session-factory>
 7
 8         <!-- 配置连接数据库的基本信息 -->
 9         <property name="connection.username">root</property>
10         <property name="connection.password"></property>
11         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
12         <!-- <property name="connection.url">jdbc:mysql:///mis</property> -->
13         <property name="connection.url">
14             <!-- 解决Mysql插入中文乱码的问题 -->
15             <![CDATA[jdbc:mysql://localhost:3306/mis?useUnicode=true&characterEncoding=utf8]]>
16         </property>
17
18
19         <!-- 配置 hibernate 的基本信息 -->
20         <!-- hibernate 所使用的数据库方言 -->
21         <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
22
23         <!-- 执行操作时是否在控制台打印 SQL -->
24         <property name="show_sql">true</property>
25
26         <!-- 是否对 SQL 进行格式化 -->
27         <property name="format_sql">true</property>
28
29         <!-- 指定自动生成数据表的策略 -->
30         <property name="hbm2ddl.auto">update</property>
31
32         <!-- 设置 Hibernate 的事务隔离级别 2:读已提交的记录-->
33         <property name="connection.isolation">2</property>
34
35         <!-- 删除对象后, 使其 OID 置为 null -->
36         <property name="use_identifier_rollback">true</property>
37
38         <!-- 配置 C3P0 数据源 -->
39         <property name="hibernate.c3p0.max_size">10</property>
40         <property name="hibernate.c3p0.min_size">5</property>
41         <property name="c3p0.acquire_increment">2</property>
42
43         <property name="c3p0.idle_test_period">2000</property>
44         <property name="c3p0.timeout">2000</property>
45
46         <property name="c3p0.max_statements">10</property>
47
48         <!-- 设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数 -->
49         <property name="hibernate.jdbc.fetch_size">100</property>
50
51         <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 -->
52         <property name="jdbc.batch_size">30</property>
53
54         <!-- 指定关联的 .hbm.xml 文件 -->
55         <!--
56         <mapping resource="com/mcs/hibernate/entities/News.hbm.xml" />
57         <mapping resource="com/mcs/hibernate/entities/Worker.hbm.xml" />
58
59         <mapping resource="com/mcs/hibernate/entities/n21/Customer.hbm.xml" />
60         <mapping resource="com/mcs/hibernate/entities/n21/Order.hbm.xml" />
61          -->
62
63         <mapping resource="com/mcs/hibernate/entities/n21/both/Customer.hbm.xml" />
64         <mapping resource="com/mcs/hibernate/entities/n21/both/Order.hbm.xml" />
65
66     </session-factory>
67
68 </hibernate-configuration>

二、基于外键的一对一映射

1、创建Java实体类

 1 package com.mcs.hibernate.entities.onetoone.foreign;
 2
 3 public class Department {
 4
 5     private Integer departmentId;
 6     private String departmentName;
 7
 8     private Manager manager;
 9
10     public Integer getDepartmentId() {
11         return departmentId;
12     }
13
14     public void setDepartmentId(Integer departmentId) {
15         this.departmentId = departmentId;
16     }
17
18     public String getDepartmentName() {
19         return departmentName;
20     }
21
22     public void setDepartmentName(String departmentName) {
23         this.departmentName = departmentName;
24     }
25
26     public Manager getManager() {
27         return manager;
28     }
29
30     public void setManager(Manager manager) {
31         this.manager = manager;
32     }
33
34
35
36 }

 1 package com.mcs.hibernate.entities.onetoone.foreign;
 2
 3 public class Manager {
 4
 5     private Integer managerId;
 6     private String managerName;
 7
 8     private Department department;
 9
10     public Integer getManagerId() {
11         return managerId;
12     }
13
14     public void setManagerId(Integer managerId) {
15         this.managerId = managerId;
16     }
17
18     public String getManagerName() {
19         return managerName;
20     }
21
22     public void setManagerName(String managerName) {
23         this.managerName = managerName;
24     }
25
26     public Department getDepartment() {
27         return department;
28     }
29
30     public void setDepartment(Department department) {
31         this.department = department;
32     }
33
34
35
36 }

2、根据实体类创建对应的 hbm.xml文件

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2015-10-28 13:38:17 by Hibernate Tools 3.5.0.Final -->
 5 <hibernate-mapping>
 6     <class name="com.mcs.hibernate.entities.onetoone.foreign.Department" table="DEPARTMENTS">
 7         <id name="departmentId" type="java.lang.Integer">
 8             <column name="DEPARTMENT_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="departmentName" type="java.lang.String">
12             <column name="DEPARTMENT_NAME" />
13         </property>
14
15         <!-- 使用 many-to-one 的方式来映射 1-1 关联关系 -->
16         <many-to-one name="manager"
17             class="com.mcs.hibernate.entities.onetoone.foreign.Manager"
18             column="MANAGER_ID"
19             unique="true"></many-to-one>
20     </class>
21 </hibernate-mapping>

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2015-10-28 13:38:17 by Hibernate Tools 3.5.0.Final -->
 5 <hibernate-mapping>
 6     <class name="com.mcs.hibernate.entities.onetoone.foreign.Manager" table="MANAGERS">
 7         <id name="managerId" type="java.lang.Integer">
 8             <column name="MANAGER_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="managerName" type="java.lang.String">
12             <column name="MANAGER_NAME" />
13         </property>
14
15         <!-- 映射 1-1 的关联关系: 在对应的数据表中已经有外键了, 当前持久化类使用 one-to-one 进行映射 -->
16         <!--
17             没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段
18          -->
19         <one-to-one name="department"
20             class="com.mcs.hibernate.entities.onetoone.foreign.Department"
21             property-ref="manager">
22         </one-to-one>
23     </class>
24 </hibernate-mapping>

注:

  1、在有外键的一端需要使用many-to-one元素,该元素使用 unique="true" 属性来约束唯一值,并指定外键栏 column="MANAGER_ID"

  2、没有外键的一端需要使用one-to-one元素,该元素使用 property-ref 属性指定使用被关联实体主键以外的字段作为关联字段

  3、在保存操作中,建议先保存没有外键列的那个对象. 这样会减少 UPDATE 语句

  4、默认情况下对关联属性使用懒加载,注意可能会出现懒加载异常的问题。

  5、在查询没有外键的实体对象时, 使用的左外连接查询, 一并查询出其关联的对象,并已经进行初始化。

三、基于主键的一对一映射

1、创建Java实体类

 1 package com.mcs.hibernate.entities.onetoone.primary;
 2
 3 public class Department {
 4
 5     private Integer departmentId;
 6     private String departmentName;
 7
 8     private Manager manager;
 9
10     public Integer getDepartmentId() {
11         return departmentId;
12     }
13
14     public void setDepartmentId(Integer departmentId) {
15         this.departmentId = departmentId;
16     }
17
18     public String getDepartmentName() {
19         return departmentName;
20     }
21
22     public void setDepartmentName(String departmentName) {
23         this.departmentName = departmentName;
24     }
25
26     public Manager getManager() {
27         return manager;
28     }
29
30     public void setManager(Manager manager) {
31         this.manager = manager;
32     }
33
34
35
36 }

 1 package com.mcs.hibernate.entities.onetoone.primary;
 2
 3 public class Manager {
 4
 5     private Integer managerId;
 6     private String managerName;
 7
 8     private Department department;
 9
10     public Integer getManagerId() {
11         return managerId;
12     }
13
14     public void setManagerId(Integer managerId) {
15         this.managerId = managerId;
16     }
17
18     public String getManagerName() {
19         return managerName;
20     }
21
22     public void setManagerName(String managerName) {
23         this.managerName = managerName;
24     }
25
26     public Department getDepartment() {
27         return department;
28     }
29
30     public void setDepartment(Department department) {
31         this.department = department;
32     }
33
34
35
36 }

2、根据实体类创建对应的 hbm.xml文件

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2015-10-28 13:38:17 by Hibernate Tools 3.5.0.Final -->
 5 <hibernate-mapping>
 6     <class name="com.mcs.hibernate.entities.onetoone.primary.Department" table="DEPARTMENTS">
 7         <id name="departmentId" type="java.lang.Integer">
 8             <column name="DEPARTMENT_ID" />
 9             <!-- 使用外键的方式来生成当前的主键 -->
10             <generator class="foreign" >
11                 <!-- property 属性指定使用当前持久化类的哪一个属性的主键作为外键 -->
12                 <param name="property">manager</param>
13             </generator>
14         </id>
15         <property name="departmentName" type="java.lang.String">
16             <column name="DEPARTMENT_NAME" />
17         </property>
18
19         <!--
20         采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,
21         其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束
22         -->
23         <one-to-one name="manager"
24             class="com.mcs.hibernate.entities.onetoone.primary.Manager"
25             constrained="true">
26         </one-to-one>
27     </class>
28 </hibernate-mapping>

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2015-10-28 13:38:17 by Hibernate Tools 3.5.0.Final -->
 5 <hibernate-mapping>
 6     <class name="com.mcs.hibernate.entities.onetoone.primary.Manager" table="MANAGERS">
 7         <id name="managerId" type="java.lang.Integer">
 8             <column name="MANAGER_ID" />
 9             <generator class="native" />
10         </id>
11         <property name="managerName" type="java.lang.String">
12             <column name="MANAGER_NAME" />
13         </property>
14
15         <one-to-one name="department"
16             class="com.mcs.hibernate.entities.onetoone.primary.Department">
17         </one-to-one>
18     </class>
19 </hibernate-mapping>

注:

  1、其中一端会使用另外一端的主键做为主键,另外一端代码采用 foreign 主键生成器策略的一端增加 one-to-one 元素映射关联属性,其 one-to-one 节点还应增加 constrained=true 属性, 以使当前的主键上添加外键约束。 

  2、在保存操作中,建议先保存没有外键列的那个对象. 这样会减少 UPDATE 语句

  3、默认情况下对关联属性使用懒加载,注意可能会出现懒加载异常的问题。

时间: 2024-11-04 13:42:51

Hibernate的一对一映射的相关文章

9.hibernate的一对一映射

一.hibernate的一对一按照外键映射 1.创建如下sql脚本: 1 --员工账号表 2 create table USERS1 3 ( 4 USERID NUMBER(6) not null, 5 USERNAME VARCHAR2(20), 6 USERPASS VARCHAR2(20) 7 ) 8 ; 9 10 11 12 --档案表 13 create table RESUME1 14 ( 15 RESID NUMBER(6) not null, 16 RESUSERID NUMBE

Hibernate(七)一对一映射

一.创建数据库表 --班级表 create table grade ( gid number primary key, --班级ID gname varchar2(50), --班级名称 gdesc varchar2(50) --班级介绍 ); --学生表 create table student ( sid number primary key, --主键ID学生ID sname varchar2(20), --学生姓名 sex varchar2(20), --学生性别 gid number

(12)Hibernate一对一映射

只要你肯努力,没有什么事情是你不能搞砸的. 需求:一个汽车(Car)有一个引擎(Engine),它是一对一的映射关系. 对于一对一的映射,有两种实现方式:基于外键的映射和基于主键的映射.这两种方式学习的重点就是映射文件的配置,推荐使用第一种方式. 1.基于外键的映射 Car.java package com.rk.hibernate.k_one2one; public class Car { private int carId; private String carName; private E

hibernate的实体映射(一对一)

Hibernate的实体映射的主要任务就是实现数据库关系表与持久化类之间的映射,其关系如图: 双向映射一对一关联关系,通过唯一外键方式进行一对一关联映射,就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系. 例如,以下例子,社团与社团负责人(社长),两者之间是一对一的关联关系: 持久化类association.java: public class Association implements java.io.Serializable{     private Integer id;   

【Hibernate步步为营】--单向关联一对一映射(一)

上篇文章对多对一的关联映射做了详细的分析,它在实现上可以有两种方式,并且这两种方式实现也很简单,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系,这种映射关系既是对象模型中的聚合关系.接下来继续讨论关联映射. 一.唯一外键 唯一外键说的是数据库表中的每一行的外键唯一对应着另一张表中的主键,也就是说一个表的主键作为另一张表的外键,并且它们之间的关系是唯一的,这种反应到关系模型中如下图所示: 上图的两个实体表,分别为人和身份证,很明显的一个人对应着一个身份证.身份证作为

hibernate笔记--基于主键的单(双)向的一对一映射关系

上一节介绍的基于外键的一对一映射关系中,在Person表中有一个外键列idCard_id,对应的idCard表的主键id,至于基于主键的一对一映射关系,就是指Person表中抛弃了idcard_id这个外键列,而与idCard表共用一个主键,或者说是其外键为主键的表结构,这种基于主键的双向一对一映射关系应该这样配置: 新建一个IdCard实体类: public class IdCard { private int id; private String code; private Person p

【Hibernate步步为营】--双向关联一对一映射具体解释(一)

一对一的映射在对象模型中是常常见到的,为了将对象模型转换为关系模型就必须在映射文件里进行配置,上篇文章讨论了一对一映射的单向关联的情况,重点是<one-to-one>标签的使用,须要在映射的主对象中加入该标签,并将该对象的主键设置为foreign这样就实现了主键关联映射.讨论完了单向接下来讨论双向映射. 一.双向主键关联 双向的主键关联事实上是单向一对一主键关联的一种特殊情况.仅仅只是要在关联对象的两端的映射文件里都要进行<one-to-one>的配置.另外还要在主映射的主键一端採

【Hibernate步步为营】--双向关联一对一映射详解(二)

很不好意思,有两天时间没有更新博客文章了,不写文章的日子还真是感觉很空洞啊,养成了写文章的恶习想改也改不掉啊.说点题外话,前两天收到一位朋友的私信,邀请笔者写一篇有关OWS的文章,用来研究图标工具的一种技术,很荣幸收到这位朋友的邀请,但是因为这几天开发的项目着急上线所以暂时没有时间去研究,只能等这周末了,利用周末的时间来研究然后更新类似的技术文章. 回到文章的正题,上篇文章讨论了双向主键关联,它其实是一对一主键关联的一种特殊情况,想要实现双向的关联就必须在映射文件的两端同时配置<one-to-o

java框架篇---hibernate(一对一)映射关系

对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从一种形式转换到另外一种形式. 面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据.内存中的对象之间存在关联和继承关系,而在数据库中,关系数