04.Hibernate一对一关联
1.数据库表的一对一关联关系

CREATE TABLE tb_customer(id bigint NOT NULL auto_increment COMMENT 'ID',name varchar(50) NOT NULL COMMENT '客户名称',home_address bigint COMMENT '客户家庭地址',PRIMARY KEY (id)) COMMENT = '客户信息表';CREATE TABLE tb_address(id bigint NOT NULL auto_increment COMMENT 'ID',zipcode varchar(50) NOT NULL COMMENT '邮政编码',address varchar(200) NOT NULL COMMENT '地址',PRIMARY KEY (id)) COMMENT = '地址信息表';-- 可选的外键约束ALTER TABLE tb_customer ADD CONSTRAINT fk_tb_customer_tb_address_1 FOREIGN KEY (home_address) REFERENCES tb_address (id);

CREATE TABLE tb_customer(id bigint NOT NULL auto_increment COMMENT 'ID',name varchar(50) NOT NULL COMMENT '客户名称',PRIMARY KEY (id)) COMMENT = '客户信息表';CREATE TABLE tb_address(id bigint NOT NULL auto_increment COMMENT 'ID',zipcode varchar(50) NOT NULL COMMENT '邮政编码',address varchar(200) NOT NULL COMMENT '地址',PRIMARY KEY (id)) COMMENT = '地址信息表';-- 可选的外键约束- ALTER TABLE tb_address ADD CONSTRAINT fk_tb_address_tb_customer_1 FOREIGN KEY (id) REFERENCES tb_customer (id);
package model;public class Address{private Long id;private String zipcode;private String address;private Customer customer;@Overridepublic String toString(){return "Address [id=" + id + ", zipcode=" + zipcode + ", address=" + address + ", customer=" + customer.getName() + "]";}// 省略setter、getter...}
package model;public class Customer{private Long id;private String name;private Address homeAddress;@Overridepublic String toString(){return "Customer [id=" + id + ", name=" + name + ", homeAddress=" + homeAddress.getAddress() + "]";}// 省略setter、getter...}
2.按照外键映射一对一关联
<hibernate-mapping package="model"><class name="Address" table="tb_address"><id name="id"><generator class="native"></generator></id><property name="zipcode" column="zipcode" /><property name="address" column="address" /><one-to-one name="customer" class="model.Customer" property-ref="homeAddress"/></class></hibernate-mapping>
<hibernate-mapping package="model"><class name="Customer" table="tb_customer"><id name="id"><generator class="native"></generator></id><property name="name" column="name" /><many-to-one name="homeAddress" class="model.Address" column="home_address" unique="true" cascade="all"/></class></hibernate-mapping>
- 在外键方使用many-to-one元素配置外键,如:<many-to-one column="home_address" 。
- 在外键参照的主键方要使用one-to-one元素映射关联对象,如:<one-to-one name="customer" class="model.Customer" 。
- 在many-to-one元素中要配置unique属性值为true,表明每个Customer对象都有唯一的Address对象关联,形成一对一。
- 在many-to-one元素中建议配置cascade属性值为all,表明保存、更新、删除Customer对象会级联操作Address对象。
- 在one-to-one元素中要配置property-ref属性值为homeAddress,表明建立了从Customer对象的homeAddress属性到Address对象的关系。
public static void main(String[] args){Customer customer;Address address;Configuration cfg = new Configuration();cfg.configure();ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();SessionFactory sf = cfg.buildSessionFactory(sr);System.out.println("连接数据库");Session session = sf.openSession();Transaction transaction = session.beginTransaction();try{customer=new Customer();address=new Address();customer.setName("测试客户01");address.setZipcode("123456");address.setAddress("湖北省武汉市");customer.setHomeAddress(address);address.setCustomer(customer);session.save(customer);//配置使用了级联保存transaction.commit();}catch (Exception e){transaction.rollback();System.out.println("错误:" + e);}finally{session.close();System.out.println("关闭数据库");}System.exit(0);}
连接数据库Hibernate: insert into tb_address (zipcode, address) values (?, ?)Hibernate: insert into tb_customer (name, home_address) values (?, ?)关闭数据库
3.按照主键映射一对一关联
<hibernate-mapping package="model"><class name="Address" table="tb_address"><id name="id"><generator class="foreign"><param name="property">customer</param></generator></id><property name="zipcode" column="zipcode" /><property name="address" column="address" /><one-to-one name="customer" class="model.Customer" constrained="true"/></class></hibernate-mapping>
<hibernate-mapping package="model"><class name="Customer" table="tb_customer"><id name="id"><generator class="native"></generator></id><property name="name" column="name" /><one-to-one name="homeAddress" class="model.Address" cascade="all"/></class></hibernate-mapping>
- 在Address对象的映射配置中的one-to-one元素属性constrained="true",表示tb_address表的ID主键同时作为外键参照tb_customer表的ID主键,此时Address对象的OID生成策略必须使用foreign。
- Address主键生成使用了foreign策略,Hibernate就会保证对象与关联的对象共享同一个OID。
- 在Customer对象映射配置文件中建议配置cascade="all",表明保存、更新、删除Customer对象会级联操作Address对象。
连接数据库Hibernate: insert into tb_customer (name) values (?)Hibernate: insert into tb_address (zipcode, address) values (?, ?)关闭数据库
4.相关配置详解
<one-to-one name="PropertyName"access="field|property"class="ClassName"property-ref="PropertyNameFromAssociatedClass"constrained="true|false"formula="arbitrary SQL expression"cascade="all|none|save-update|delete"fetch="join|select"outer-join="true|false"foreign-key="foreign-key"lazy="true|false"embed-xml="true|false"entity-name="EntityName"node="element-name"/>
- name:实体类属性名。
- access:默认的实体类属性访问模式,取值为property表示访问getter、setter方法间接访问实体类字段,取值为field表示直接访问实体类字段(类成员变量)。
- class:关联的类的名字,默认是通过反射得到属性类型。
- property-ref:指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键。
- constrained:表示使用主键关联一对一关系,一张表的主键同时也是外键,参照另一张表的主键。
- formula:一个SQL表达式,定义了这个计算属性的值,计算属性没有和它对应的数据库字段。
- cascade:指明哪些操作会从父对象级联到关联的对象。
- fetch:参数指定了关联对象抓取的方式是select查询还是join查询,默认为select。fetch="join"等同于outer-join="true",fetch="select"等同于outer-join="false"。
- outer-join:设置Hibernate是否使用外连接获取关联的数据,设置成true可以减少SQL语句的条数。
- foreign-key:关联的数据库外键名。
- lazy:是否采用延迟加载策略。
- embed-xml:如果embed-xml="true",则对应于被关联实体或值类型的集合的XML树将直接嵌入拥有这些关联的实体的XML树中,默认值为true。
- entity-name:Hibernate3新增特性,用于动态模型(Dynamic Model)支持。Hibernate3允许一个类进行多次映射(前提是映射到不同的表)。
- node:配置说明。
04.Hibernate一对一关联的更多相关文章
- Hibernate一对一关联映射配置
一.一对一关联 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分别完成以下持久化操作: (1 ...
- 【学习笔记】Hibernate 一对一关联映射 组件映射 二级缓存 集合缓存
啊讲道理放假这十天不到啊 感觉生活中充满了绝望 这就又开学了 好吧好吧继续学习笔记?还是什么的 一对一关联映射 这次我们仍然准备了两个表 一个是用户表Users 一个是档案表Resume 他们的关系是 ...
- Hibernate 一对一关联映射,mappedBy参数解析
在最近java,SSH框架的学习中遇到了这样的一个问题,在Hibernate的开发中一对一关联映射的单向关联,主表会在次表新增一列次表的主键如下图,但是在双向关联中次表不会在表中创建主表的主键一列,这 ...
- hibernate一对一关联
hibernate一对一主键关联 一对一主键关联指的是两个表通过主键形成的一对一映射. 数据表要求:A表的主键也是B表的主键同时B表的主键也是A表的外键 sql: create table peopl ...
- Hibernate 一对一关联查询
版权声明:本文为博主原创文章,如需转载请标注转载地址. 博客地址:http://www.cnblogs.com/caoyc/p/5602418.html 一对一关联,可以分为两种.一种是基于外键的关 ...
- Hibernate 一对一关联映射
package com.entity; import javax.persistence.Entity; import javax.persistence.OneToOne; @Entity publ ...
- hibernate一对一关联手动改表后No row with the given identifier exists:
articleId手动改了一个并不存在的值 把被控端的id改成存在的就好了
- hibernate一对一外键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一外键单向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- C#获取程序所在目录路径
方法1:Directory.GetCurrentDirectory().这个方法只能在.NET的完整版中使用,NETCF中不支持该功能,调用时会引发异常.获取的是当前目录,并不一定是真正的路径,跟Op ...
- VS2008无法切换到视图设计器
编写人:CC阿爸 2014-2-17 近来用于干活的笔记本电脑实在太慢了,在领导的安排下,有幸更换了一台配置好的电脑.经过一天的努力,所有之前的开发软件都安装完成了.并且OS从xp升级到win7.SQ ...
- 在SQL中取出字符串中数字部分或在SQL中取出字符部分
在SQL中取出字符串中数字部分或在SQL中取出字符部分 编写人:CC阿爸 2013-10-18 近来在开发一个项目时,一包含数字的字符串,需要取出中间的数字部分进行排序.经过baidu搜索.并结合自己 ...
- c#中执行多条sql语句【ORA-00911: 无效字符】
问题描述: 在plsql里执行多条sql语句的时候,使用“,”(逗号)分隔,测试可以执行多条,而在C#执行多条sql语句的时候[ORA-00911: 无效字符]. 有时我们需要一次性执行多条sql语句 ...
- shell字符串操作详解
shell字符串操作详解的相关资料. 1.shell变量声明的判断 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DE ...
- js JSON对象属性
json对象是是一种用于原生json分析的对象,无法对其进行构造函数调用,用java术语 来说,它相当于能够直接使用类方法的工具类JSON对象的属性parse(text[,reviver]);对参数t ...
- 【Window】Tor(洋葱头路由)+Privoxy 网络实践(附带Java实例代码)
1.背景 平时我们需要访问onion后缀的网站,需要通过Tor(The Onion Router,洋葱路由器).一般来说安装Tor Broswer就可以满足需要.但是项目我要做的是通过程序来获取oni ...
- RecyclerView的基本创建
线性显示 类似于listview: 线性宫格显示 类似于grid view: 用线性宫格显示 类似于瀑布流: 结构图: 测试代码: activity_main.xml: <RelativeLay ...
- python 核心编程第二版 课后习题 第11章
11-3 函数.在这个练习中,我们将实现 max()和 min()内建函数. (a) 写分别带两个元素返回一个较大和较小元素,简单的 max2()核 min2()函数.他们应该可以用任意的 pytho ...
- 编译android程序时DEX过程出现错误
今天编译高级设置时出现了错误,这好坑爹啊~ 于是我开始检查代码,发现代码没有错误啊,然后观察MAKE的步骤才发现是DEX时出现了问题!! 下面是错误的LOG: Information:Using ja ...