복붙노트

[SPRING] 스프링 데이터에서 JPA 엔티티를 아름답게 업데이트하는 방법은 무엇입니까?

SPRING

스프링 데이터에서 JPA 엔티티를 아름답게 업데이트하는 방법은 무엇입니까?

그래서 스프링 데이터를 사용하는 JPA에 대한 다양한 자습서를 살펴 보았습니다. 그리고 이것은 많은 경우에 따라 다르게 수행되었으므로 올바른 접근 방식이 무엇인지 잘 모르겠습니다.

다음 엔티티가 있다고 가정합니다.

package stackoverflowTest.dao;

import javax.persistence.*;

@Entity
@Table(name = "customers")
public class Customer {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private long id;

@Column(name = "name")
private String name;

public Customer(String name) {
    this.name = name;
}

public Customer() {
}

public long getId() {
    return id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

또한 DTO가 서비스 계층에서 검색된 다음 컨트롤러 / 클라이언트 측에 전달됩니다.

package stackoverflowTest.dto;

public class CustomerDto {

private long id;
private String name;

public CustomerDto(long id, String name) {
    this.id = id;
    this.name = name;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

이제 고객이 webui에서 자신의 이름을 변경하기를 원한다고 가정합니다. 그러면 이전 컨트롤러 ID와 새 이름이있는 업데이트 된 DTO가있는 컨트롤러 동작이있게됩니다.

이제이 업데이트 된 DTO를 데이터베이스에 저장해야합니다.

현재 불행히도 기존 고객을 업데이트 할 수있는 방법은 없습니다 (DB의 항목을 삭제하고 새로운 자동 생성 ID를 사용하여 새 Cusomter를 만드는 것 제외)

그러나 이것이 실현 가능하지 않기 때문에 (특히 그러한 주체가 잠재적으로 수백 가지의 관계를 가질 수 있다고 생각할 때) - 따라서 내 마음에 2 가지 직접적인 해결책이 있습니다.

또는

그래서 내 질문은 어떻게 할 일반적인 규칙이 있는지 여부입니다. 어쩌면 내가 설명한 두 가지 방법의 단점은 무엇일까요?

해결법

  1. ==============================

    1.더 좋은 방법은 @Tanjim Rahman이 스프링 데이터 JPA를 사용하여 T getOne (ID id) 메소드를 사용할 수 있다는 대답이다.

    더 좋은 방법은 @Tanjim Rahman이 스프링 데이터 JPA를 사용하여 T getOne (ID id) 메소드를 사용할 수 있다는 대답이다.

    Customer customerToUpdate = customerRepository.getOne(id);
    customerToUpdate.setName(customerDto.getName);
    customerRepository.save(customerToUpdate);
    

    getOne (ID id)는 참조 (프록시) 객체 만 가져오고 DB에서 가져 오지 않기 때문에 더 좋습니다. 이 참조에서는 원하는 것을 설정할 수 있으며 save ()에서는 예상대로 SQL UPDATE 문을 수행합니다. comparsion에서 @Tanjim Rahmans와 같이 find ()를 호출하면 spring 데이터에 대한 응답 JPA는 DB에서 엔티티를 물리적으로 가져 오기 위해 SQL SELECT를 수행한다.

  2. ==============================

    2.간단한 JPA 업데이트 ..

    간단한 JPA 업데이트 ..

    Customer customer = em.find(id, Customer.class); //Consider em as JPA EntityManager
    customer.setName(customerDto.getName);
    em.merge(customer);
    
  3. ==============================

    3.이것은 jpa 질문보다 더 많은 객체 초기화 질문입니다. 두 방법 모두 작동하며 두 값을 동시에 가질 수 있습니다. 일반적으로 생성자 매개 변수를 사용하기 전에 데이터 멤버 값이 준비되어 있으면이 값이 될 수 있습니다. 인스턴스 생성 후에 업데이트가 필요합니다.

    이것은 jpa 질문보다 더 많은 객체 초기화 질문입니다. 두 방법 모두 작동하며 두 값을 동시에 가질 수 있습니다. 일반적으로 생성자 매개 변수를 사용하기 전에 데이터 멤버 값이 준비되어 있으면이 값이 될 수 있습니다. 인스턴스 생성 후에 업데이트가 필요합니다.

  4. ==============================

    4.엔티티가 아닌 DTO로 작업해야하는 경우 기존 Customer 인스턴스를 검색하고 업데이트 된 필드를 DTO에서 해당 필드로 매핑해야합니다.

    엔티티가 아닌 DTO로 작업해야하는 경우 기존 Customer 인스턴스를 검색하고 업데이트 된 필드를 DTO에서 해당 필드로 매핑해야합니다.

    Customer entity = //load from DB
    //map fields from DTO to entity
    
  5. ==============================

    5.나는 어디에서나 jpa와 같은 기록을 갱신 할 수 없다는 것을 본다. 그것은 지원되지 않습니다. 나는 당신에게 html로 숨겨진 변수를 가져 와서 기존의 레코드 ID 필드에 바인딩 한 다음 폼을 게시하고 해당 ID로 레코드를 가져온 다음 게시 된 레코드 개체를 저장하고 기존 레코드 ID 필드에 저장하면 기록.

    나는 어디에서나 jpa와 같은 기록을 갱신 할 수 없다는 것을 본다. 그것은 지원되지 않습니다. 나는 당신에게 html로 숨겨진 변수를 가져 와서 기존의 레코드 ID 필드에 바인딩 한 다음 폼을 게시하고 해당 ID로 레코드를 가져온 다음 게시 된 레코드 개체를 저장하고 기존 레코드 ID 필드에 저장하면 기록.

    그래서 열쇠는 숨겨진 필드에있는 기존 레코드 ID를 가져가는 것입니다.

  6. from https://stackoverflow.com/questions/39741102/how-to-beautifully-update-a-jpa-entity-in-spring-data by cc-by-sa and MIT license