双向一对一

一对一主要用在

一个一方需要的信息比较少,比如注册的登录信息

另一个一方存储的信息比较多,比如注册之后用户填写的详细信息

实现方式常用的主要有2种:

java模型都是一样,其中一个映射文件有所不同

hibernate.cfg.xml

<mapping resource="com/jege/hibernate/two/way/onetoone/User.hbm.xml" />
<mapping resource="com/jege/hibernate/two/way/onetoone/UserInfo.hbm.xml" />

User

//主一
public class User {
private Long id;
private String username;
private String password;
private UserInfo info;

UserInfo

//从一
public class UserInfo {
private Long id;
private Integer age;
private String address;
private User user;

User.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jege.hibernate.two.way.onetoone">
<class name="User" table="t_user">
<id name="id">
<generator class="native" />
</id>
<property name="username" />
<property name="password" />
<one-to-one name="info" class="UserInfo" />
</class>
</hibernate-mapping>

模拟外键一对一UserInfo.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jege.hibernate.two.way.onetoone">
<class name="UserInfo" table="t_user_info">
<id name="id">
<generator class="native" />
</id>
<property name="age" />
<property name="address" />
<!-- 使用多对一的方式来模拟一对一的关系 -->
<!-- unique="true"外键的唯一 -->
<many-to-one name="user" class="User" column="user_id" unique="true" />
</class>
</hibernate-mapping> CREATE TABLE `t_user_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`user_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UK_ln50dwtk2w5skl1rpjfek5srv` (`user_id`),
CONSTRAINT `FK_ln50dwtk2w5skl1rpjfek5srv` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

共享主键一对一

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.jege.hibernate.two.way.onetoone">
<class name="UserInfo" table="t_user_info">
<id name="id">
<generator class="foreign">
<!-- UserInfo的主键来自于当前user属性的id -->
<param name="property">user</param>
</generator>
</id>
<property name="age" />
<property name="address" />
<!-- 共享主键是关系双方的主键是一样的值 -->
<!-- constrained="true"添加约束的关键 -->
<one-to-one name="user" constrained="true" />
</class>
</hibernate-mapping> CREATE TABLE `t_user_info` (
`id` bigint(20) NOT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `FK_ihje4vsyvt8vmuhru59ib9j1d` FOREIGN KEY (`id`) REFERENCES `t_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

还有一种可以使用多一张中间表,设置主键唯一,外键同时唯一的方式,不过基本没有使用场景。

源码地址

https://github.com/je-ge/hibernate

如果觉得我的文章对您有帮助,请予以打赏。您的支持将鼓励我继续创作!谢谢!



Hibernate 系列教程7-双向一对一的更多相关文章

  1. JPA 系列教程10-双向一对一关联表

    双向一对一关联表的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255 ...

  2. JPA 系列教程9-双向一对一唯一外键

    双向一对一唯一外键的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(25 ...

  3. JPA 系列教程8-双向一对一共享主键

    双向一对一共享主键的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(25 ...

  4. Hibernate 系列教程16-二级缓存

    pom.xml <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate- ...

  5. Hibernate 系列教程9-自关联

    自关联:本质还是原来双向一对多,原来要配置两个类,现在全部都配置在一个类里面 Employee public class Employee { private Long id; private Str ...

  6. Hibernate 系列教程6-双向多对多

    双向多对多inverse配置 如果关系两边都使用默认inverse=false配置,表示关系两边都可以管理中间表的数据 关系其中一边设置inverse=true配置,表示自己放弃管理中间表关系,由对方 ...

  7. Hibernate 系列教程5-双向多对一

    主要讲解inverse和cascade的用法 cascade定义的是关系两端对象到对象的级联关系: 而inverse定义的是关系和对象的级联关系(管理外键的值). inverse 属性默认是false ...

  8. Hibernate 系列教程17-查询缓存

    在二级缓存配置成功的基础上进行查询缓存配置 Product public class Product { private Long id; private String name; Product.h ...

  9. Hibernate 系列教程15-一级缓存

    Product public class Product { private Long id; private String name; Product.hbm.xml <class name= ...

随机推荐

  1. .Net Core 上传图片

    /// <summary> /// 图片上传并存入数据库 /// </summary> /// <returns></returns> public J ...

  2. UVALive 7352 Dance Recital

    题意: 有n种舞蹈要跳 每种舞蹈需要每一行字符串所对应的那些人 如果一个人连着跳两个舞蹈 那么需要一个quick change 问需要的最少quick changes是多少 思路: 假期的题 又拿出来 ...

  3. ThinkPHP模板

    [MVC模式] M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 tp框架url地址可以由以下四种 http://网址/in ...

  4. 5.编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试St

    Student类: package com.bao; public class Student { int stuNo;String name,sex;int age,weight; Student( ...

  5. 实现ie6下的居中

    代码如下所示,转自 http://w3help.org/zh-cn/causes/RT8003 对于 text-align 的讨论. <div style="width:200px; ...

  6. POJ 3419 Difference Is Beautiful

    先处理出每一个i位置向左最远能到达的位置L[i].每一次询问,要找到L,R区间中的p位置,p位置左边的L[i]都是小于L的,p位置开始,到R位置,L[i]都大于等于L,对于前者,最大值为p-L,后者求 ...

  7. 《Windows驱动开发技术详解》之自定义StartIO

    自定义StartIO 系统定义的StartIO队列只能使用一个队列(DDK提供的StartIO内部只有一个队列),这个队列将所有的IRP进行处理化.例如,读.写操作都会混在一起进行串行处理.然而,有时 ...

  8. Table隔行变色的JavaScript代码

    <table id="datatable"> <tr> <td>脚本之家</td> </tr> <tr> & ...

  9. 关于js中原型链的理解

    我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,一个对象.无论什么时候,我们只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性对象 ...

  10. 文本输入框和下拉菜单特效-用正则表达式验证E-mail格式

    ———————————————————————————— <script type="text/javascript">                         ...