newcodingtest / ProjectManagementSystem

:sunny::sunny:레거시 코드 리펙토링 해보기:sunny::sunny:
1 stars 0 forks source link

연관관계 자식 수정은 어떻게 해야할까??? #34

Open newcodingtest opened 2 years ago

newcodingtest commented 2 years ago

https://stackoverflow.com/questions/24186767/how-do-i-update-a-jpa-field-that-has-orphanremoval-true

스택 오버플로우에 의하면

 @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval=true)
@JoinTable(name = "user_address", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "address_id"))
    private Set<Address> addresses;

public void setAddresses(Set<Address> addresses) {  
    //1. remove the existing addresses that are not found in the new ones
    this.addresses.retainAll(addresses);
    //2. add the new addresses too, the common ones will be ignored by the Set semantics
    this.addresses.addAll(addresses);
}

위의 예제 처럼 기존에 존재하는 연관관계를 지우고 새롭게 등록하는 로직을 추천하고 있다.

newcodingtest commented 2 years ago

image

위의 사진 관계이다

public class Task extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="TASK_ID")
    private Long tid;
    ...
    @OneToMany(mappedBy = "task", fetch = FetchType.LAZY, orphanRemoval = true)
    private List<SubTask> subTaskList = new ArrayList<SubTask>();
public class SubTask extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="SUB_ID")
    private Long sid;
    ...
    @ManyToOne
    private Task task;
newcodingtest commented 2 years ago

상위작업_하위작업을 한곳에서 수정하는 로직을 택하고 있다.

public class TaskServiceImpl implements TaskService {

    private final TaskRepository taskRepository;
    private final SubTaskRepository subTaskRepository;

    @Transactional
    @Override
    public long registerOrModify(TaskDTO dto) {

    //1.파라미터로 들어온 상위작업을 갖고있는 하위작업들을 찾는다.
    //2.1번 조건에 만족하는 하위작업들을 삭제한다.
    //3.파라미터로 들어온 상위작업을 등록 또는 수정한다.
    //4.파라미터로 들어온 새로운 하위작업들을 추가한다.
    }

서비스 단에서는 상위 Repository 하위 Repository 를 각각 불러 save를 호출해줄 생각이다.

그러나 2개를 일일히 호출하기 보다는 1개로 할 수 있는 방법이 있을꺼같은데.... 상위 행동 하나로 하위 까지 같이 등록시키는 방법이 있나 좀더 고민해봐야 겠다..