この詳細なガイドでは、相互の 1 対 1 の関連付け、CRUD 操作、および効率的なデータ モデリングにおける mappedBy、@JsonManagedReference、および @JsonBackReference の役割の複雑さを説明します。
簡潔な例を通じて、エンティティの定義から始めて、これらの概念をシームレスに統合する方法を示します。
エンティティをモデル化することから始めましょう。次に、Hibernate がテーブルを生成する方法を調べます。
この例では、Address を 1 対 1 の関係の所有側として指定し、Organization を参照側として指定します。このアプローチにより、アドレス テーブルと組織テーブルの両方で外部キー関係が確実に確立されます。それでは、コードを詳しく見てみましょう。この関係を定義するには、 @OneToOne アノテーションと組み合わせてmappedBy属性を利用します。 mappedBy 属性は関係の参照側を指定し、関係のキーが反対側に存在することを Hibernate に示します。双方向の 1 対 1 リレーションをマスターし、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 属性は常に「親」に設定され、アドレスが所有側の役割を引き受け、組織が逆参照として機能することを意味します。
アドレス リポジトリ モジュール
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-bidirection-starter でアクセスできます。
{
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3