双向一对一

一对一主要用在

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

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

实现方式常用的主要有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. Entity Framework删除数据

    注:本文为个人学习摘录,原文地址:http://blog.csdn.net/itmaxin/article/details/47659817 最近在学EF,目前了解到删除操作有三种方式, 第一,官方推 ...

  2. kettle连接Hive中数据导入导出(6)

    1.hive往外写数据 http://wiki.pentaho.com/display/BAD/Extracting+Data+from+Hive+to+Load+an+RDBMS 连接hive

  3. 在IE8中如何通过javascripts改变<style />中的内容?

    1.createStyleSheet() if(document.createStyleSheet){  var cssStyle=document.createStyleSheet();  //兼容 ...

  4. android Tweened Animations

    Android提供了两种类型的动画: 一类是Tween动画:提供了旋转.移动.伸展和淡出等效果: 第二类是Frame-by-frame动画:这一类Animations可以创建一个Drawable序列, ...

  5. 查看mms UA/profile

    查看彩信的UA/profile信息,当然可以通过打印log来看. 但还有一个比较简便的方法: 直接抓取一个MMS包,用网络包分析工具打开,找到承载该MMS信息的HTTP协议包即可查看:

  6. 使用SpringMVC时,配置DispatcherServlet注意的url-pattern的问题

    url-pattern配置时注意: <!--springMVC配置--><servlet> <servlet-name>springMVC</servlet- ...

  7. C#第六天

    字符串的处理练习: 课上练习1:接收用户输入的字符串,将其中的字符以与输入相反的顺序输出."abc"→"cba" 方法1: string str = " ...

  8. c# 获取命名空间 类名 方法名

    c# 获取命名空间 类名 方法名 转[http://blog.sina.com.cn/s/blog_3fc2dcc1010189th.html]   分类: Winform public static ...

  9. grub4dos新手指南-2

    Grub4dos 新手指南 一.GRUB4DOS的配置文件Grub4dos 有三个文件,grldr.grldr.mbr和menu.lst,配置文件是menu.lst,和GRUB一样.该文件一般放在和启 ...

  10. Elasticsearch Java虚拟机配置详解(转)

    引言: 今天,事情终于发生了.Java6(Mustang),是2006年早些时候出来的,至今仍然应用在众多生产环境中,现在终于走到了尽头.已经没有什么理由阻止迁移到Java7(Dolphin)上了. ...