Hibernate 菜鸟教程 7 双向一对一
2016-11-20 20:31
357 查看
GitHub
双向一对一
一对一主要用在一个一方需要的信息比较少,比如注册的登录信息
另一个一方存储的信息比较多,比如注册之后用户填写的详细信息
实现方式
常用的主要有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;
方案1:唯一外键一对一
唯一外键一对一映射文件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>
唯一外键一对一sql语句
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;
方案2:共享主键一对一
共享主键一对一映射文件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="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>
共享主键一对一sql语句
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 菜鸟教程 6 双向多对多
- JPA 菜鸟教程 9 双向一对一唯一外键
- Hibernate 菜鸟教程 5 双向多对一
- JPA 菜鸟教程 8 双向一对一共享主键
- JPA 菜鸟教程 10 双向一对一关联表
- Hibernate关联关系配置-----基于连接表的双向一对一映射配置
- Hibernate 一对一主键双向关联
- Hibernate关系映射(4)_一对一双向主键关联
- hibernate 一对一、多对一 双向关联的问题——只能在多的一方添加、修改数据,不能在多的一方修改添加
- Hibernate 一对一连接表双向关联
- Hibernate一对一外键双向关联(Annotation配置篇)
- Hibernate关联关系配置-----基于连接表的双向一对一映射配置
- Hibernate 一对一主键双向关联
- Hibernate一对一主键双向关联映射(xml配置)
- Hibernate一对一外键双向关联(Annotation配置篇)
- Hibernate一对一外键双向关联(Annotation配置篇)
- Hibernate一对一外键双向关联(Annotation配置篇)
- Hibernate关系映射(2)_一对一双向外键关联
- Hibernate 一对一外键双向关联
- 九、Hibernate一对一唯一外键关联(双向关联)