En esta guía detallada, exploraremos las complejidades de las asociaciones mutuas uno a uno, las operaciones CRUD y el papel de mappedBy, @JsonMangedReference y @JsonBackReference en el modelado de datos eficiente.
A través de un ejemplo conciso, demostraremos cómo integrar perfectamente estos conceptos, comenzando con la definición de entidad.
Comencemos modelando nuestras entidades.A continuación, examinaremos cómo Hibernate genera las tablas.
En este ejemplo, hemos designado Dirección como el lado propietario de la relación uno a uno, con Organización como el lado de referencia. Este enfoque garantiza que la relación de clave externa se establezca tanto en las tablas de direcciones como en las de organización. Ahora, profundicemos en el código. Utilizaremos el atributo mappedBy junto con la anotación @OneToOne para definir esta relación. El atributo mappedBy especifica el lado de referencia de la relación, indicando a Hibernate que la clave de la relación reside en el otro lado. Para dominar las relaciones bidireccionales uno a uno y desbloquear todo el potencial de Spring Data JPA, visite t8tech.com.
Entidad organizativa
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; } }
Entidad de dirección institucional
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 = Organización.clase, mappedBy = "dirección")
organización organización privada;
En este escenario particular, el atributo mappedBy se establece invariablemente en "principal", lo que implica que la Dirección asumirá el rol del lado propietario, mientras que la Organización servirá como referencia inversa.
Módulo de repositorio de direcciones
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 { }
Módulo de repositorio de organización
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{ }
Controlador de gestión de direcciones
@RestControllerpublic class AddressController { @Autowired private AddressRepository addressRepository; @GetMapping("/address/retrieve/all") public List retrieveAllAddresses() { return addressRepository.findAll(); } }
Controlador de gestión de la organización
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); } }
Programa Integral de Asistencia Organizacional
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"); } }
Configurando la aplicación
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
Ahora, iniciemos la aplicación. Abra Postman y cree una nueva organización utilizando el objeto JSON que se proporciona a continuación.
Puedes acceder al código fuente de este proyecto en https://github.com/gudpick/jpa-demo/tree/one-to-one-bidireccional-starter.
{
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3