Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

1:Hibernate的关联关系映射的一对一外键映射:

  1.1:第一首先引包,省略

  1.2:第二创建实体类:

    这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键。

    创建User.java:

用户和身份证一对一的关联关系映射           private IdCart idCart;

    IdCart.java:

身份证和用户,一对一的关系           private User user;

 1 package com.bie.bean;
 2 /** 
 3 * @author BieHongLi 
 4 * @version 创建时间:2017年3月22日 下午2:06:35 
 5 * 用户的实体类
 6 */
 7 public class User {
 8 
 9     private int id;
10     private String name;
11     
12     //用户和身份证一对一的关联关系映射
13     private IdCart idCart;
14 
15     public int getId() {
16         return id;
17     }
18 
19     public void setId(int id) {
20         this.id = id;
21     }
22 
23     public String getName() {
24         return name;
25     }
26 
27     public void setName(String name) {
28         this.name = name;
29     }
30 
31     public IdCart getIdCart() {
32         return idCart;
33     }
34 
35     public void setIdCart(IdCart idCart) {
36         this.idCart = idCart;
37     }
38 
39     @Override
40     public String toString() {
41         return "User [id=" + id + ", name=" + name + ", idCart=" + idCart + "]";
42     }
43     
44 }
 1 package com.bie.bean;
 2 /** 
 3 * @author BieHongLi 
 4 * @version 创建时间:2017年3月22日 下午2:07:09 
 5 * 用户身份证信息的实体类
 6 */
 7 public class IdCart {
 8 
 9     private String cartNum;//身份证号,主键,对象唯一标识
10     private String place;
11     
12     //身份证和用户,一对一的关系
13     private User user;
14 
15     public String getCartNum() {
16         return cartNum;
17     }
18 
19     public void setCartNum(String cartNum) {
20         this.cartNum = cartNum;
21     }
22 
23     public String getPlace() {
24         return place;
25     }
26 
27     public void setPlace(String place) {
28         this.place = place;
29     }
30 
31     public User getUser() {
32         return user;
33     }
34 
35     public void setUser(User user) {
36         this.user = user;
37     }
38 
39     @Override
40     public String toString() {
41         return "IdCart [cartNum=" + cartNum + ", place=" + place + ", user=" + user + "]";
42     }
43 
44 }

  1.3:创建好实体类,就可以开始配置映射关系了:

    User.hbm.xml:

<one-to-one name="idCart" class="IdCart"></one-to-one>

    IdCart.hbm.xml:

<!--               (1)一对一映射,有外键方               (2)特殊的多对一映射,多了一个外键,设置主键唯一性               (3)cascade="save-update"级联保存               (4)用户表的主键做身份证信息的外键               (5)unique="true"给外键字段添加唯一约束              --> <many-to-one cascade="save-update" unique="true" name="user" column="userId" class="User">

    </many-to-one>

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="com.bie.bean">
 6     <class name="User" table="user2">
 7         <!-- 主键映射 -->
 8         <id name="id" column="id">
 9             <generator class="native"></generator>
10         </id>    
11         
12         <!-- 非主键映射 -->
13         <property name="name" column="name" type="string" length="20"></property>
14         
15         
16         <!-- 其他字段映射 -->
17         <!-- 
18             一对一映射,没有主键
19          -->
20         <one-to-one name="idCart" class="IdCart"></one-to-one>
21         
22     </class>
23 
24 </hibernate-mapping>
25     
26     
 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="com.bie.bean">
 6     <class name="IdCart" table="idCart">
 7         <!-- 主键映射 -->
 8         <id name="cartNum" column="cartNum">
 9             <!-- <generator class="native"></generator> -->
10             <!-- 身份证信息自己手动设置更加人性化哦 -->
11             <generator class="assigned"></generator>
12         </id>
13         
14         <!-- 非主键映射 -->
15         <property name="place" column="place" type="string" length="20"></property>
16         
17         <!-- 其他字段映射 -->
18         <!-- 
19             (1)一对一映射,有外键方
20             (2)特殊的多对一映射,多了一个外键,设置主键唯一性
21             (3)cascade="save-update"级联保存
22             (4)用户表的主键做身份证信息的外键
23             (5)unique="true"给外键字段添加唯一约束
24          -->
25         <many-to-one cascade="save-update" unique="true" name="user" column="userId" class="User"></many-to-one>
26         
27     </class>
28 </hibernate-mapping>

  1.4:最后就可以配置Hibernate.cfg.xml配置了。

 1 <!DOCTYPE hibernate-configuration PUBLIC
 2     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 3     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 4 
 5 <hibernate-configuration>
 6     <!-- 一个session-factory节点代表一个数据库 -->
 7     <session-factory>
 8         <!-- 第一部分:数据库连接配置 -->
 9         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
10         <property name="hibernate.connection.url">jdbc:mysql:///test</property>
11         <property name="hibernate.connection.username">root</property>
12         <property name="hibernate.connection.password">123456</property>
13         
14         <!-- 第二部分:其他相关配置 -->
15         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
16         <property name="hibernate.show_sql">true</property>
17         <!-- <property name="hibernate.format_sql">true</property> -->
18         <property name="hibernate.hbm2ddl.auto">create</property>
19         <!-- 
20              1:每次在创建sessionFactory时执行创建表,当调用sessionFactory的close方法的时候,删除表
21              #hibernate.hbm2ddl.auto create-drop
22             
23             2:每次都重新建表,如果已经存在就先删除再创建
24             #hibernate.hbm2ddl.auto create
25             
26             3:如果表不存在就创建,表存在就不创建
27             #hibernate.hbm2ddl.auto update
28             
29             4:生成环境时候执行验证,当映射文件的内容与数据库表结构不一样的时候就报错
30             #hibernate.hbm2ddl.auto validate
31           --> 
32         
33         <!-- 第三部分,加载映射文件 -->
34         <!-- <mapping resource="com/bie/po/User.hbm.xml"/> -->
35         
36         
37         <!-- 第三部分,加载映射文件,一对一主键和外键的映射的练习 -->
38         <mapping resource="com/bie/bean/User.hbm.xml"/>
39         <mapping resource="com/bie/bean/IdCart.hbm.xml"/>
40         
41     </session-factory>
42 </hibernate-configuration>    
43     
44     
45     

  1.5:最后测试,既可以完成对一对一外键映射的使用和学习:

 1 package com.bie.test;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 import org.junit.Test;
 7 
 8 import com.bie.bean.IdCart;
 9 import com.bie.bean.User;
10 
11 /** 
12 * @author BieHongLi 
13 * @version 创建时间:2017年3月22日 下午2:51:34 
14 * 
15 */
16 public class One2One {
17 
18     private static SessionFactory sf = null;
19     static{
20         sf = new Configuration().configure().buildSessionFactory();
21     }
22     
23     @Test
24     public void test(){
25         Session session = sf.openSession();
26         session.beginTransaction();
27         
28         //用户信息
29         User user = new User();
30         user.setName("张三三");
31         
32         //身份证信息
33         IdCart idCart = new IdCart();
34         idCart.setCartNum("41072519930416****");
35         idCart.setPlace("深圳市");
36         
37         //设置用户信息和身份证信息的关系
38         idCart.setUser(user);
39         
40         //如果设置级联操作,只用保存身份证信息即可
41         session.save(idCart);
42         
43         session.getTransaction().commit();
44         session.close();
45     }
46 }

2:Hibernate的关联关系映射的一对一主键映射:

  2.1:第一步引包省略

  2.2:第二步,创建实体类,和上面的实体类的区别就是在身份证实体类表里面加了一个成员变量

      private int id;//用户表的主键做身份证表的主键

  2.3:第三步配置映射文件,这里修改的主要是身份证的映射文件,修改如下所示:

    User.hbm.xml:主要是包的改动

<hibernate-mapping package="com.bie.domain"></hibernate-mapping>

    IdCart.hbm.xml:这个改动略大哦

<!-- 主键映射 -->            <id name="id" column="id">              <generator class="foreign">                   <param name="property">user</param>                 </generator>             </id>

<one-to-one name="user" constrained="true" class="User"></one-to-one>

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC 
 3     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 4     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 5 <hibernate-mapping package="com.bie.domain">
 6     <class name="IdCart" table="idCart">
 7         <!-- 主键映射 -->
 8         <id name="id" column="id">
 9         <!-- 
10             id节点指定的是主键映射,即id是主键
11             主键生成方式:foreign即把别的表的主键作为当前表的主键,
12                 property(关键字,不能修改)指定引用的对象==》对象的全名com.bie.domain.User==》
13                 对象映射文件com.bie.domain.xml==》表table(id)
14          -->
15             <generator class="foreign">
16                 <param name="property">user</param>
17             </generator>
18         </id>
19         
20         <property name="cartNum" column="cartNum" type="string" length="20"></property>
21         <!-- 非主键映射 -->
22         <property name="place" column="place" type="string" length="20"></property>
23         
24         <!-- 其他字段映射 -->
25         <!-- 
26             (1)一对一映射,有外键方
27             (2)用户表的主键做身份证表的主键
28             (3)constrained="true"设置外键
29          -->
30         <one-to-one name="user" constrained="true" class="User"></one-to-one>
31         
32     </class>
33 </hibernate-mapping>

Hibernate的关联关系的映射搞清楚如何映射会使用即可,这里LZ记录方便为了自行脑补~~~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端之路

J2Cache二级缓存'没有自动更新'

在给组内小伙伴们做完二级缓存的普及关于两级缓存的说明后,组内小伙伴使用二级缓存开发了公告功能。 功能如下: <cache name="notice" ...

1907
来自专栏Java帮帮-微信公众号-技术文章全总结

day08.MAPREDUCE详解【大数据教程】

1583
来自专栏肖蕾的博客

使用Retrofit打印请求日志,过滤改变服务器返回结果,直接获取String字符串直接获取字符串手动解析查看Retrofit请求网络日志自定义Interceptor实现过滤改变请求返回的数据(可使用

1342
来自专栏jeremy的技术点滴

JVM的Finalization Delay引起的OOM

3378
来自专栏程序员宝库

徒手撸框架---实现 Aop

原文:犀利豆的博客(https://www.xilidou.com/2018/01/13/spring-aop/) 上一讲我们讲解了 Spring 的 IoC ...

28412
来自专栏与神兽党一起成长

jFinal路由解析源码分析

jFinal的路由解析是在JFinalFilter中做的,这个Filter也需要在web.xml中配置。JFinalFilter实现了javax.servlet...

842
来自专栏battcn

一起来学SpringBoot | 第十八篇:轻松搞定全局异常

实际项目开发中,程序往往会发生各式各样的异常情况,特别是身为服务端开发人员的我们,总是不停的编写接口提供给前端调用,分工协作的情况下,避免不了异常的发生,如果直...

792
来自专栏程序猿DD

Spring框架中的设计模式(四)​

本文是Spring框架中使用的设计模式第四篇。本文将在此呈现出新的3种模式。一开始,我们会讨论2种结构模式:适配器和装饰器。在第三部分和最后一部分,我们将讨论单...

3446
来自专栏Android 研究

OKHttp源码解析(七)--中阶之缓存机制

Entry内部类是实际用于存储的缓存数据的实体类,每一个url对应一个Entry实体

995
来自专栏开发技术

spring事务源码解析

  在spring jdbcTemplate 事务,各种诡异,包你醍醐灌顶!最后遗留了一个问题:spring是怎么样保证事务一致性的? 当然,spring事务内...

541

扫码关注云+社区