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

简介: 1:Hibernate的关联关系映射的一对一外键映射:   1.1:第一首先引包,省略   1.2:第二创建实体类:     这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信息的外键,这里先做外键。

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 }
View Code
 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 }
View Code

  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记录方便为了自行脑补~~~

目录
相关文章
|
3月前
|
Java 数据库连接 API
解锁高效开发秘籍:深入探究 Hibernate 如何优雅处理一对多与多对多关系,让数据映射再无烦恼!
【9月更文挑战第3天】Hibernate 是 Java 领域中最流行的 ORM 框架之一,广泛用于处理实体对象与数据库表之间的映射。尤其在处理复杂关系如一对多和多对多时,Hibernate 提供了丰富的 API 和配置选项。本文通过具体代码示例,展示如何使用 `@OneToMany`、`@JoinColumn`、`@ManyToMany` 和 `@JoinTable` 等注解优雅地实现这些关系,帮助开发者保持代码简洁的同时确保数据一致性。
65 4
|
4月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
92 0
|
4月前
|
数据库 开发者 Java
Hibernate映射注解的魔力:实体类配置的革命,让你的代码量瞬间蒸发!
【8月更文挑战第31天】Hibernate 是一款出色的对象关系映射框架,简化了 Java 应用与数据库的交互。其映射注解让实体类配置变得直观简洁。本文深入剖析核心概念与使用技巧,通过示例展示如何简化配置。
56 0
|
7月前
|
Java 数据库连接 数据库
Hibernate5中实体映射命名策略
Hibernate5中实体映射命名策略
144 0
|
7月前
|
SQL 存储 Java
Hibernate - 继承关联关系映射
Hibernate - 继承关联关系映射
75 0
|
7月前
|
机器学习/深度学习 SQL Java
Hibernate - 多对多关联关系映射
Hibernate - 多对多关联关系映射
71 0
|
7月前
|
SQL Java 数据库连接
Hibernate -双向一对一关联关系映射
Hibernate -双向一对一关联关系映射
57 0
|
7月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
1月前
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
19 1
|
4月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
63 1