双向一对一

一对一主要用在

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

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

实现方式常用的主要有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

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



最新文章

  1. Binder in Java
  2. OKhttp基本使用介绍
  3. 查看mysqll账号信息
  4. Selenium2学习-035-WebUI自动化实战实例-033-页面快照截图应用之三 -- 区域截图(专业版)
  5. lucene4.7学习总结
  6. NeHe OpenGL教程 第十三课:图像字体
  7. FusionCharts 3.2.1 flash 图表展示、数据钻取
  8. HW4.15
  9. 上机实践 - - 一个例子了解C/C++中指针与数组的区别
  10. unity 3d 生成apk文件时,设置图标
  11. 51nod1138(math)
  12. [补档]从OI学麻将
  13. JavaScript--我发现,原来你是这样的JS(再说引用类型,基本包装类型与个体内置对象)
  14. 修真院java后端工程师学习课程--任务1(day four)
  15. xpath获取下一页,兄弟结点的妙用
  16. python3安装pcap遇到的问题
  17. sql语句中的join用法(可视化解释)
  18. sort方法实际应用详解---javascript中对一个对象数组按照对象某个属性进行排序
  19. 如何规避Adobe Flash Player中重橙网络的广告弹窗
  20. linux如何通过脚本来修改用户的密码?脚本自动化修改用户密码?

热门文章

  1. 图的连通性:有向图强连通分量-Tarjan算法
  2. hdu_5925_Coconuts(离散化+dfs)
  3. SHELL自动运行脚本
  4. ESFramework ——可堪重任的网络通信框架
  5. c++的复制构造函数
  6. (转载)app ico图标字体制作
  7. PHP input 显示html 元素
  8. 一把刀系统维护工具箱 v1.6 绿色版
  9. Python in minute
  10. iOS 计算两个坐标之间的距离