"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Maîtrisez les relations bidirectionnelles un à un en quelques étapes : améliorez l'efficacité de Spring Data JPA

Maîtrisez les relations bidirectionnelles un à un en quelques étapes : améliorez l'efficacité de Spring Data JPA

Publié le 2024-11-07
Parcourir:846

Libérer la puissance des relations bidirectionnelles un-à-un

Dans ce guide détaillé, nous explorerons les subtilités des associations mutuelles un-à-un, des opérations CRUD et le rôle de mappedBy, @JsonManagedReference et @JsonBackReference dans une modélisation efficace des données.

  • Comprendre les associations mutuelles un-à-un
  • Rationalisation des opérations CRUD
  • L'importance de mappedBy
  • Démystifier @JsonManagedReference
  • Libérer le potentiel de @JsonBackReference

À travers un exemple concis, nous montrerons comment intégrer de manière transparente ces concepts, en commençant par la définition de l'entité.

Commençons par modéliser nos entités.Master Bidirectional One-to-One Relations in teps: Boost Spring Data JPA EfficiencyEnsuite, nous examinerons comment Hibernate génère les tables.

Master Bidirectional One-to-One Relations in teps: Boost Spring Data JPA EfficiencyDans cet exemple, nous avons désigné Address comme côté propriétaire de la relation individuelle, avec Organization comme côté référencement. Cette approche garantit que la relation de clé étrangère est établie à la fois dans les tables d'adresses et d'organisation. Passons maintenant au code. Nous utiliserons l'attribut mappedBy en conjonction avec l'annotation @OneToOne pour définir cette relation. L'attribut mappedBy spécifie le côté référencement de la relation, indiquant à Hibernate que la clé de la relation réside de l'autre côté. Pour maîtriser les relations bidirectionnelles un-à-un et libérer tout le potentiel de Spring Data JPA, visitez t8tech.com.

Entité organisationnelle

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;
    }
}

Entité d'adresse institutionnelle

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 = "adresse")

Organisation privée ;

Dans ce scénario particulier, l'attribut mappedBy est invariablement défini sur « parent », ce qui implique que l'adresse assumera le rôle du côté propriétaire, tandis que l'organisation servira de référence inverse.

Module de référentiel d'adresses

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
{ }

Module de référentiel d'organisation

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 {
}

Contrôleur de gestion des adresses

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

Contrôleur de gestion de l'organisation

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);
    }
}

Programme complet d'assistance organisationnelle

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");
    }
}

Configuration de l'application

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

Maintenant, lançons l'application. Ouvrez Postman et créez une nouvelle organisation à l'aide de l'objet JSON fourni ci-dessous.

Vous pouvez accéder au code source de ce projet sur https://github.com/gudpick/jpa-demo/tree/one-to-one-bidirectionnel-starter.

{
Déclaration de sortie Cet article est reproduit sur : https://dev.to/emilyjohnsonready/master-bidirectionnel-one-to-one-relations-in-5-steps-boost-spring-data-jpa-efficiency-1m13?1S'il y en a infraction, veuillez contacter [email protected] pour supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3