java Hibernate 一对多自身关联问题

yizhihongxing

下面是“java Hibernate 一对多自身关联问题”的完整攻略。

一对多自身关联问题解析

一对多自身关联指的是一个实体类与自身的关联,且一个实体类可以关联多个相同类型的实体类对象。

这种关联关系很常见,例如“部门-员工”,一个部门下可以有多个员工,而一个员工也归属于某个部门。

Hibernate中实现一对多自身关联通常有两种方式:双向关联和单向关联。

双向关联

双向关联指同时在两个实体类之间建立关联关系。

例如我们有一个实体类Employee,表示员工信息,一个员工可以有多个下属员工,实现代码如下:

public class Employee {
    private Long id;
    private String name;
    // 下属员工
    private List<Employee> subordinates = new ArrayList<>();
    // 上级员工
    private Employee superior;
    // 省略getter/setter方法
}
  • Employee类中,我们定义了一个subordinates属性,表示当前员工的下属员工列表。
  • 我们还定义了一个superior属性,表示当前员工的直接上级。

这里的关联关系是双向的,即一个员工有多个下属,同时一个下属也有一个直接上级,这个直接上级也是一个员工。

Employee类中,我们需要使用Hibernate的注解来实现关联关系的映射,例如:

@Entity
@Table(name = "employee")
public class Employee {
    // ...
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    // 下属员工
    @OneToMany(targetEntity = Employee.class, mappedBy = "superior", cascade = CascadeType.ALL)
    private List<Employee> subordinates = new ArrayList<>();
    // 上级员工
    @ManyToOne(targetEntity = Employee.class)
    @JoinColumn(name = "superior_id")
    private Employee superior;
    // 省略getter/setter方法
}

在这里,我们使用了@OneToMany注解表示当前员工有多个下属,同时使用了mappedBy属性来指定关联关系的维护方是Employee类中的superior属性,即由下属员工维护关联关系。

同时,我们还使用了@ManyToOne注解表示当前员工有一个上级员工,使用@JoinColumn注解指定了关联的外键字段是superior_id

这样,我们就完成了实体类之间的关联。

在使用时,我们可以通过给某个员工添加下属来建立关联关系,例如:

Employee ceo = new Employee();
ceo.setName("John");
Employee cto = new Employee();
cto.setName("Mary");
cto.setSuperior(ceo);
Employee developer1 = new Employee();
developer1.setName("Tom");
developer1.setSuperior(cto);
Employee developer2 = new Employee();
developer2.setName("Jack");
developer2.setSuperior(cto);

ceo.getSubordinates().add(cto);
cto.getSubordinates().add(developer1);
cto.getSubordinates().add(developer2);

通过以上代码,我们建立了3个员工的关联关系。ctodeveloper1以及developer2cto的下属,ctoceo的下属。

通过Hibernate的自动级联功能,我们可以使用save方法将这些员工对象保存到数据库中,例如:

Session session = sessionFactory.getCurrentSession();
session.beginTransaction();

session.save(ceo);
session.save(cto);
session.save(developer1);
session.save(developer2);

session.getTransaction().commit();

在这里,我们使用Hibernate的getCurrentSession方法获得当前线程的Session,然后开启一个事务并保存ceoctodeveloper1developer2对象,调用commit方法提交事务,Hibernate就会将对象保存到数据库中。

单向关联

单向关联指只在一个实体类中建立关联关系。

例如我们有一个实体类Category,表示商品分类信息,每个分类下可以有多个商品,实现代码如下:

public class Category {
    private Long id;
    private String name;
    // 商品列表
    private List<Product> products = new ArrayList<>();
    // 省略getter/setter方法
}
  • Category类中,我们定义了一个products属性,表示当前分类下的商品列表。

这里的关联关系是单向的,即一个分类有多个商品,但是一个商品没有一个明确的所属分类,只有分类保存了关联关系。

Category类中,我们同样需要使用Hibernate的注解来实现关联关系的映射,例如:

@Entity
@Table(name = "category")
public class Category {
    // ...
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    // 商品列表
    @OneToMany(targetEntity = Product.class, cascade = CascadeType.ALL)
    @JoinColumn(name = "category_id")
    private List<Product> products = new ArrayList<>();
    // 省略getter/setter方法
}

在这里,我们使用了@OneToMany注解表示当前分类有多个商品,使用@JoinColumn注解指定了关联的外键字段是category_id,由于是单向关联,所以没有使用mappedBy属性。

在使用时,我们同样是先创建一个Category对象,然后将多个Product对象添加到该分类的商品列表中,例如:

Category category = new Category();
category.setName("Fruits");

Product product1 = new Product();
product1.setName("Apple");
product1.setCategory(category);
Product product2 = new Product();
product2.setName("Banana");
product2.setCategory(category);

category.getProducts().add(product1);
category.getProducts().add(product2);

通过以上代码,我们建立了一个分类和两个商品之间的关联关系。两个商品属于同一个分类。

同样,通过Hibernate的自动级联功能,我们可以将这些对象保存到数据库中,例如:

Session session = sessionFactory.getCurrentSession();
session.beginTransaction();

session.save(category);
session.save(product1);
session.save(product2);

session.getTransaction().commit();

在这里,我们同样是使用Hibernate的getCurrentSession方法获取当前线程的Session,然后开启一个事务并将categoryproduct1product2对象保存到数据库中,最后提交事务。

总结

Java Hibernate可以很方便地实现一对多自身关联问题,常用的实现方式是双向关联和单向关联,开发者可以根据具体的场景选择适合自己的方式,并通过Hibernate的自动级联完成关联对象的持久化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java Hibernate 一对多自身关联问题 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java实现可视化界面肯德基(KFC)点餐系统代码实例

    Java实现可视化界面肯德基(KFC)点餐系统 1. 系统介绍 本系统是基于Java编程语言实现的可视化界面肯德基(KFC)点餐系统。该系统通过图形用户界面(GUI)实现了用户对菜品的选择,购物车的添加与删除等基本操作。本系统的目标是帮助用户更加方便、快捷地选择自己喜欢的肯德基(KFC)菜品,并实现订单的管理和处理。 2. 系统实现 2.1 系统功能 本系统…

    Java 2023年5月24日
    00
  • JAVA如何调用wsdl过程详解

    在JAVA中调用WSDL过程需要使用SOAP协议,以实现在网络间的交互。 以下是JAVA调用WSDL过程的详细攻略: 1. 导入WSDL文件 首先需要导入WSDL文件,可以使用JAVA的wsimport工具实现自动生成JAVA代码。在命令行中进入wsimport所在文件夹,输入以下命令: wsimport <WSDL地址> 实际执行时,可以将替换…

    Java 2023年5月26日
    00
  • 腾讯云服务器搭建Jenkins详细介绍

    腾讯云服务器搭建Jenkins详细介绍 介绍 Jenkins是一个自动化工具,它提供了很多插件和工具,可以用于构建、测试和部署软件。本文将介绍如何在腾讯云服务器上搭建Jenkins。 步骤 选择合适的云服务器 在腾讯云控制台中,选择云服务器服务,然后选择合适的云服务器实例。可以根据自己的需求选择不同的规格、地区、镜像等选项。 开启端口 要使用Jenkins,…

    Java 2023年5月19日
    00
  • Maven中怎么手动添加jar包到本地仓库详解(repository)

    下面是Maven手动添加jar包到本地仓库的攻略: 1. 创建lib目录 首先需要创建一个目录来存放手动添加的jar包,可以取名为lib,放在任意目录下。 2. 执行命令 在lib目录下,执行以下命令将jar包安装到本地仓库: mvn install:install-file -DgroupId=xxx -DartifactId=xxx -Dversion=…

    Java 2023年5月20日
    00
  • Springboot 2.x集成kafka 2.2.0的示例代码

    下面我会详细讲解Springboot 2.x集成Kafka 2.2.0的示例代码的完整攻略。 前置条件:1. 已安装JDK和Maven;2. 已安装并起动好Zookeeper和Kafka。 步骤一:创建Springboot项目1. 打开IDEA,在左侧导航栏中选择New Project;2. 在弹出对话框中选择Spring Initializr,点击Next…

    Java 2023年5月20日
    00
  • Java 对象深拷贝工具类的实现

    概述: Java 对象深拷贝是指将一个对象完全复制另一个对象,即所有属性和属性值都被复制,并且两个对象之间没有相互影响。在 Java 开发中经常会使用对象深拷贝,比如在进行对象传参、克隆等场合都需要进行对象深拷贝。本文将详细讲解 Java 对象深拷贝工具类的实现。 实现: Java 中提供了两种方式实现深拷贝:Serializable 和 Cloneable…

    Java 2023年5月26日
    00
  • C#实现HTML转WORD及WORD转PDF的方法

    C#实现HTML转WORD及WORD转PDF的方法攻略 HTML转WORD 实现HTML转WORD的方法可以简单地概括为以下几个步骤: 使用HTML解析器解析HTML代码,并将其转化为文本片段; 将文本片段转化为Word中的文档对象模型(Document Object Model, DOM); 将DOM对象写入Word文档。 下面给出一些示例说明。 示例1:…

    Java 2023年6月15日
    00
  • JSP 的本质原理解析:”编写的时候是JSP,心里想解读的是 java 源码”

    JSP 的本质原理解析:”编写的时候是JSP,心里想解读的是 java 源码” @ 目录 JSP 的本质原理解析:”编写的时候是JSP,心里想解读的是 java 源码” 每博一文案 1. JSP 概述 2. 第一个 JSP 程序 3. JSP 的本质就是 Servlet 4. JSP 的基础语法 4.1 在 JSP 文件中直接编写文字 4.2 在JSP中编写…

    Java 2023年4月30日
    00
合作推广
合作推广
分享本页
返回顶部