”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 轻松掌握双向一对一关系:提升 Spring Data JPA 效率

轻松掌握双向一对一关系:提升 Spring Data JPA 效率

发布于2024-11-07
浏览:327

释放双向一对一关系的力量

在本深入指南中,我们将探讨相互一对一关联、CRUD 操作的复杂性,以及在高效数据建模中mappedBy、@JsonManagedReference 和 @JsonBackReference 的作用。

  • 理解相互的一对一关联
  • 简化 CRUD 操作
  • mappedBy 的重要性
  • 揭秘@JsonManagedReference
  • 释放@JsonBackReference的潜力

通过一个简洁的示例,我们将演示如何从实体定义开始无缝集成这些概念。

让我们首先对实体进行建模。Master Bidirectional One-to-One Relations in teps: Boost Spring Data JPA Efficiency接下来,我们将研究 Hibernate 如何生成表。

Master Bidirectional One-to-One Relations in teps: Boost Spring Data JPA Efficiency在此示例中,我们将 Address 指定为一对一关系的拥有方,将 Organization 指定为引用方。此方法可确保在地址表和组织表中都建立外键关系。现在,让我们深入研究代码。我们将利用mappedBy 属性与@OneToOne 注释结合起来定义这种关系。 mappedBy 属性指定关系的引用方,向 Hibernate 指示关系的键位于另一方。要掌握双向一对一关系并释放 Spring Data JPA 的全部潜力,请访问 t8tech.com。

组织实体

package com.notyfyd.entity;

import javax.persistence.*;

@Entity@Table(name = "t_organization")
public class Organization {
    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long entityId;
    private String companyName;
    private String organizationCode;
    @OneToOne(targetEntity = Address.class, cascade = CascadeType.ALL)
    private Address headquarters;
    public Long getEntityId() {
        return this.entityId;
    }
    public void setEntityId(Long entityId) {
        this.entityId = entityId;
    }
    public String getCompanyName() {
        return this.companyName;
    }
    public void setCompanyName(String companyName) {
        this.companyName = companyName;
    }
    public String getOrganizationCode() {
        return this.organizationCode;
    }
    public void setOrganizationCode(String organizationCode) {
        this.organizationCode = organizationCode;
    }
    public Address getHeadquarters() {
        return this.headquarters;
    }
    public void setHeadquarters(Address headquarters) {
        this.headquarters = headquarters;
    }
}

机构地址实体

package com.notyfyd.entity;

import javax.persistence.*;

@Entity@Table(name = "t_address")
public class Address {
    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String building;
    private String street;
    private String city;
    private String state;
    private String country;
    private String zipcode;
    @OneToOne(targetEntity = Organization.class, mappedBy = "address")
    private Organization organization;
    public Long getId() {
        return this.id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getBuilding() {
        return this.building;
    }
    public void setBuilding(String building) {
        this.building = building;
    }
    public String getStreet() {
        return this.street;
    }
    public void setStreet(String street) {
        this.street = street;
    }
    public String getCity() {
        return this.city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public String getState() {
        return this.state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public String getCountry() {
        return this.country;
    }
    public void setCountry(String country) {
        this.country = country;
    }
    public String getZipcode() {
        return this.zipcode;
    }
    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public Organization getOrganization() {
        return organization;
    }

    public void setOrganization(Organization organization) {
        this.organization = organization;
    }
}

@OneToOne(targetEntity = Organization.class,mappedBy =“地址”)

私人组织;

在此特定场景中,mappedBy 属性始终设置为“parent”,这意味着 Address 将承担拥有方的角色,而 Organization 将充当反向引用。

地址存储库模块

package com.notyfyd.repository;

import com.notyfyd.entity.Address;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repositorypublic interface AddressRepository extends JpaRepository
{ }

组织存储库模块

package com.notyfyd.repository;

import com.notyfyd.entity.Organization;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repositorypublic interface OrganizationRepository extends JpaRepository {
}

地址管理控制器

@RestControllerpublic class AddressController {
    @Autowired    private AddressRepository addressRepository;
    
    @GetMapping("/address/retrieve/all")    public List
retrieveAllAddresses() { return addressRepository.findAll(); } }

组织管理控制器

package com.notyfyd.controller;

import com.notyfyd.entity.Organization;
import com.notyfyd.repository.OrganizationRepository;
import com.notyfyd.service.OrganizationService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestControllerpublic class OrganizationController {
    private OrganizationService organizationService;
    private OrganizationRepository organizationRepository;

    public OrganizationController(OrganizationService organizationService, OrganizationRepository organizationRepository) {
        this.organizationService = organizationService;
        this.organizationRepository = organizationRepository;
    }

    @PostMapping("/organization/create")    public ResponseEntity<Object> createOrganization(@RequestBody Organization organization) {
        return organizationService.createOrganization(organization);
    }
    @DeleteMapping("/organization/delete/{id}")    public ResponseEntity<Object> deleteOrganization(@PathVariable Long id) {
        if(organizationRepository.findById(id).isPresent()) {
            organizationRepository.deleteById(id);
            if (organizationRepository.findById(id).isPresent())
                return ResponseEntity.unprocessableEntity().body("Failed to delete the specified organization");
            else return ResponseEntity.ok("Successfully deleted the specified organization");
        } else return ResponseEntity.unprocessableEntity().body("Specified organization not present");
    }
    @GetMapping("/organization/get/{id}")    public Organization getOrganization(@PathVariable Long id) {
        if(organizationRepository.findById(id).isPresent())
            return organizationRepository.findById(id).get();
        else return null;
    }
    @GetMapping("/organization/get")    public List<Organization> getOrganizations() {
        return organizationRepository.findAll();
    }

    @PutMapping("/organization/update/{id}")    public ResponseEntity<Object> updateOrganization(@PathVariable Long id, @RequestBody Organization org) {
        return organizationService.updateOrganization(id, org);
    }
}

综合组织援助计划

package com.notyfyd.service;

import com.notyfyd.entity.Address;
import com.notyfyd.entity.Organization;
import com.notyfyd.repository.AddressRepository;
import com.notyfyd.repository.OrganizationRepository;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Servicepublic class OrganizationService {
    private OrganizationRepository organizationRepository;
    private AddressRepository addressRepository;

    public OrganizationService(OrganizationRepository organizationRepository, AddressRepository addressRepository) {
        this.organizationRepository = organizationRepository;
        this.addressRepository = addressRepository;
    }

    @Transactional    public ResponseEntity<Object> createOrganization(Organization organization) {
        Organization org = new Organization();
        org.setName(organization.getName());
        org.setOrgId(organization.getOrgId());
        org.setAddress(organization.getAddress());
        Organization savedOrg = organizationRepository.save(org);
        if(organizationRepository.findById(savedOrg.getId()).isPresent())
            return ResponseEntity.ok().body("Organization created successfully.");
        else return ResponseEntity.unprocessableEntity().body("Failed to create the organization specified.");
    }

    @Transactional    public ResponseEntity<Object> updateOrganization(Long id, Organization org) {
        if(organizationRepository.findById(id).isPresent()) {
            Organization organization = organizationRepository.findById(id).get();
            organization.setName(org.getName());
            organization.setOrgId(org.getName());
            Address address = addressRepository.findById(organization.getAddress().getId()).get();
            address.setBuilding(organization.getAddress().getBuilding());
            address.setStreet(organization.getAddress().getStreet());
            address.setCity(organization.getAddress().getCity());
            address.setState(organization.getAddress().getState());
            address.setCountry(organization.getAddress().getCountry());
            address.setZipcode(organization.getAddress().getZipcode());
            Address savedAddress =  addressRepository.save(address);
            organization.setAddress(savedAddress);
            Organization savedOrganization = organizationRepository.save(organization);
            if(organizationRepository.findById(savedOrganization.getId()).isPresent())
                return ResponseEntity.ok().body("Successfully Updated Organization");
            else return ResponseEntity.unprocessableEntity().body("Failed to update the specified Organization");
        } else return ResponseEntity.unprocessableEntity().body("The specified Organization is not found");
    }
}

配置应用程序

server.port=2003
spring.datasource.driver-class-name= org.postgresql.Driver
spring.datasource.url= jdbc:postgresql://192.168.64.6:30432/jpa-test
spring.datasource.username = postgres
spring.datasource.password = root
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=create

现在,让我们开始申请吧。打开 Postman 并使用下面提供的 JSON 对象创建一个新组织。

您可以在 https://github.com/gudpick/jpa-demo/tree/one-to-one-bi Direction-starter 访问该项目的源代码。

{
版本声明 本文转载于:https://dev.to/emilyjohnsonready/master-bidirectional-one-to-one-relations-in-5-steps-boost-spring-data-jpa-efficiency-1m13?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 引导实用程序
    引导实用程序
    Bootstrap 实用程序是一组功能强大的类,可以让您的网站样式设置更轻松、更快捷,而无需编写自定义 CSS。让我们深入了解基础知识! 什么是 Bootstrap 实用程序? Bootstrap 实用程序是预定义的 CSS 类,您可以将它们直接应用于 HTML 元素以控制其外观或行为。这些实用程序...
    编程 发布于2024-11-07
  • 修复下拉菜单/工具提示等隐藏的溢出
    修复下拉菜单/工具提示等隐藏的溢出
    您是否曾尝试为您的按钮创建一个下拉列表,然后选择但随后被溢出隐藏阻止? 然后你该怎么做,然后你使用javascript将元素扔到DOM的根目录,然后根据触发元素矩形定位元素,每次布局更改时重新计算,发生滚动和调整窗口大小,不是很有效的。 首先我想说的是它还没有完全支持,但是现在有一个polyfill...
    编程 发布于2024-11-07
  • 如何使用中间件方法有效处理 Gin Web 应用程序中的错误?
    如何使用中间件方法有效处理 Gin Web 应用程序中的错误?
    增强 Gin 中的错误处理Gin 的自定义错误处理涉及使用中间件来处理错误响应。这允许错误逻辑与正常流程逻辑分离。错误处理中间件type appError struct { Code int Message string } func JSONAppErrorReporter(...
    编程 发布于2024-11-07
  • 如何使用 Python 和 Medium API 将文章发布到 Medium
    如何使用 Python 和 Medium API 将文章发布到 Medium
    介绍 作为使用 Obsidian 撰写文章的人,我经常发现自己在发布到 Medium 时需要手动复制和格式化我的内容。此过程可能非常耗时且重复,尤其是在处理 Markdown 文件时。为了简化我的工作流程,我决定开发一个 Python 脚本,自动将 Markdown 文件直接发布到...
    编程 发布于2024-11-07
  • 如何使用 Unicode 字符引用来表示 CSS 类名称中的百分比?
    如何使用 Unicode 字符引用来表示 CSS 类名称中的百分比?
    .container.\31 25\25在CSS中是什么意思?在CSS中,标识符可以包含特殊字符,例如反斜杠 ()。反斜杠字符在 CSS 中具有不同的用途,具体取决于上下文。转义字符在字符串中,反斜杠后跟换行符将被忽略。在字符串之外,反斜杠后跟换行符代表其自身。转义特殊字符反斜杠可用于转义特殊 CS...
    编程 发布于2024-11-07
  • 工作跟踪应用程序
    工作跟踪应用程序
    使用 MERN Stack 构建工作跟踪应用程序 在当今竞争激烈的就业市场中,在求职过程中保持井然有序可能具有挑战性。手动管理申请、面试和后续跟进很容易变得不堪重负。为了解决这个问题,我决定使用 MERN 堆栈构建一个作业跟踪应用程序。这个项目是一次有益的经历,使我能够将我的技术技...
    编程 发布于2024-11-07
  • C++ 中的“long”保证至少有 32 位吗?
    C++ 中的“long”保证至少有 32 位吗?
    long 保证有 32 位吗?尽管基于 C 标准的常见假设,但问题是 long 是否保证有至少 32 位。标准将基本整数类型分类为:sizeof(char) ≤ sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int)然而,许多人认为基于此层次结构,lon...
    编程 发布于2024-11-07
  • 加权图类
    加权图类
    The WeightedGraph class extends AbstractGraph. The preceding chapter designed the Graph interface, the AbstractGraph class, and the UnweightedGraph cl...
    编程 发布于2024-11-07
  • 从新手到忍者:为开发人员释放 Git 的力量
    从新手到忍者:为开发人员释放 Git 的力量
    Git 是每个开发者工具包中不可或缺的工具。它不仅可以帮助您有效管理代码库,还可以与团队成员无缝协作。然而,开发人员常常忽视 Git 提供的一些强大的功能和工作流程。在本博客中,我们将探讨基本的 Git 提示和技巧,以帮助开发人员简化工作流程、更有效地管理分支、轻松解决冲突以及集成 GitHub A...
    编程 发布于2024-11-07
  • 通用选择器在现代浏览器中仍然是性能杀手吗?
    通用选择器在现代浏览器中仍然是性能杀手吗?
    通用选择器对性能的影响通用选择器 (*) 将 CSS 样式应用于文档中的所有元素。虽然它曾经被认为对性能有害,但现代浏览器的进步已经减轻了它的影响。等效规则通用选择器规则 (* { margin: 0; padding : 0; }) 在功能上等同于更具体的规则 (body, h1, p { mar...
    编程 发布于2024-11-07
  • Effect-TS 中的压缩选项:实用指南
    Effect-TS 中的压缩选项:实用指南
    Effect-TS 中的压缩选项:实用指南 在函数式编程中,以安全且可预测的方式组合多个可选值(表示为选项)是一项常见任务。 Effect-TS 提供了多种将选项“压缩”在一起的方法,允许您组合它们的值或根据特定规则选择一个。在本文中,我们将探讨压缩选项的三个关键函数:O.zipR...
    编程 发布于2024-11-07
  • 提升你的 JavaScript:深入研究面向对象编程✨
    提升你的 JavaScript:深入研究面向对象编程✨
    面向对象编程 (OOP) 是一种强大的范例,它彻底改变了我们构建和组织代码的方式。 虽然 JavaScript 最初是一种基于原型的语言,但它已经发展到接受 OOP 原则,特别是随着 ES6 的引入和后续更新。 这篇文章深入研究了 JavaScript 中 OOP 的核心概念,探索如何实现它们来...
    编程 发布于2024-11-07
  • 如何在 Go 中捕获多个引用组:正则表达式解决方案
    如何在 Go 中捕获多个引用组:正则表达式解决方案
    在 Go 中捕获多个引用组本文解决了解析遵循特定格式的字符串的挑战:大写命令后跟可选引用的论点。目标是将命令和参数提取为单独的字符串。要处理此任务,需要使用正则表达式: re1, _ := regexp.Compile(([A-Z] )(?: " (1)")*)。第一个捕获组 (...
    编程 发布于2024-11-07
  • 从初学者到构建者:掌握 PHP 编程艺术
    从初学者到构建者:掌握 PHP 编程艺术
    想要学习PHP编程?分步指南帮您轻松入门!首先,安装PHP([官方网站](https://www.php.net/))。掌握变量、条件语句和循环等基本语法。通过构建一个简单的登录表单来实践:提交表单后,处理输入并验证凭证。通过这些步骤和练习,您将掌握PHP编程的基础知识。PHP编程入门指南:从初学者...
    编程 发布于2024-11-07
  • 使用 HTML、CSS 和 JavaScript 创建简单的密码管理器
    使用 HTML、CSS 和 JavaScript 创建简单的密码管理器
    您是否厌倦了使用弱密码或忘记登录凭据?在本教程中,我们将使用 HTML、CSS 和 JavaScript 创建一个简单的密码管理器。此密码管理器将允许您安全地存储您的登录凭据并在需要时检索它们。 代码:这里
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3