双向一对一

一对一主要用在

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

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

实现方式常用的主要有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. 关于CSS样式的那些事_导航条菜单讲解

    最近开始忙着开自己的个人博客了,自己的前端确实是渣渣.没办法,一步步来,从慕课网上慢慢学着先. 首先带来的是一个导航栏的设计: 垂直导航栏的设计: 直接上代码: <!DOCTYPE html P ...

  2. mysql灵活分页存储过程

    ), -- 表名 ), -- 排序字段(必须!支持多字段不用加order by) IN _PageIndex int, -- 指定当前为第几页 IN _PageSize int, -- 每页多少条记录 ...

  3. 【strtok()】——分割字符串

    对字符串进行分割: 在使用前需要先初始化例如: char * p=strtok(Str," ");/*初始化以" "(以空格字符来分割字符串),即把" ...

  4. KVM 虚拟化基本搭建

    KVM虚拟化技术 KVM是基于x86架构上Linux操作系统的全虚拟化解决方案 ,在Centos6.3系统中,kvm已经被集成到内核中,相当于使用内核来做虚拟机管理程序.由于KVM本身就工作于内核环境 ...

  5. php练习1

    <?php$conn=mysqli_init();if(!conn){ echo "mysqli_init error"; exit(0);}$ret=mysqli_real ...

  6. php 创建文件

    $myfile = fopen("newfile.txt", "w") or die("Unable to open file!"); $t ...

  7. Webdriver实现下载功能,屏蔽掉windows弹出的对话框,FireFox下设置浏览器的属性,两种实现方式:

    一.使用一个全新的FireFox浏览器打开Web应用,浏览器不带任何插件,也未对浏览器做任何默认配置,但需要对浏览器属性进行配置 // 获取浏览器的所有配置文件 ProfilesIni allProf ...

  8. CSS简介模块

    CSS3完全向后兼容. 选择器 盒模型 背景和边框 文字和特效 2D.3D特效 动画 多列布局 用户界面 今天先做个开始,今后每一天学习一点点.

  9. javaWEB总结(3):ServletConfig对象

    1.首先找到ServletConfig的API: ServletConfig封装了servlet的配置信息,并且可以获取servletContext对象. ServletConfig共有四个方法: 1 ...

  10. [转载]Linux 环境下编译 0.11版本内核 kernel

    最近在看<.如果Clobber/Modify 为空,则其前面的冒号(:)必须省略. 2.如果Output,Input,Clobber/Modify都为空,Output,Input之前的冒号(:) ...