복붙노트

[SPRING] 스프링 데이터 JPA와 1 대 1 관계 유지

SPRING

스프링 데이터 JPA와 1 대 1 관계 유지

나는 그들 사이에 OneToOne 관계를 가진 다음 두 엔티티를 가진다.

@Entity
@Table(name = "tasks")
public class Task {
    @OneToOne(mappedBy = "task", cascade = CascadeType.PERSIST)
    private Tracker tracker;

    /* More code */
}

@Entity
@Table(name = "trackers")
public class Tracker {
    @OneToOne
    @JoinColumn(name = "trk_task", unique = true)
    private Task task;

    /* More code */
}

이 코드를 실행하려고합니다.

Task task = taskService.findDispatchableTask();
if (task != null) {
    Tracker tracker = trackerService.findIdleTracker();
    if (tracker != null) {
        task.setTracker(tracker);
        task.setStatus(TaskStatus.DISPATCHED);
        taskService.save(task);
    }
}

하지만이 오류가 발생합니다.

ERROR org.hibernate.AssertionFailure  - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session) 
org.hibernate.AssertionFailure: non-transient entity has a null id

나는 "내 코드를 변경하는"그것을 해결할 수 있습니다 :

Task task = taskService.findDispatchableTask();
if (task != null) {
    Tracker tracker = trackerService.findIdleTracker();
    if (tracker != null) {
        tracker.setTask(task);
        trackerService.save(tracker);
        task.setTracker(tracker);
        task.setStatus(TaskStatus.DISPATCHED);
        taskService.save(task);
    }
}

내 질문은 OneToOne 관계를 유지하는 적절한 방법은 무엇입니까? 내 코드에서 왜 관계의 두 부분을 모두 저장하여 작동하게합니까?

해결법

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

    1.여기 우리는 다시 간다.

    여기 우리는 다시 간다.

    모든 양방향 연관에는 소유자 측과 반대 측의 두면이 있습니다. 반대면은 mappedBy 속성을 가진 것이다. 소유자 쪽이 다른 쪽입니다. JPA / Hibernate는 오너 측에만 관심이있다. 따라서 역변환을 방금 초기화하면 연결이 유지되지 않습니다.

    일반적으로 협회의 양면을 초기화하는 것이 좋습니다. 첫 번째는 소유자 측이 초기화되었는지 확인하기 때문이며 둘째 엔티티 그래프를 일관되게 만들기 때문에 자신의 이익을 위해 두 번째입니다.

    또한 트랜잭션 내부에서 작업하는 경우 쿼리에 의해 반환 된 모든 엔터티는 연결된 엔터티입니다. 엔터티에 적용된 변경 사항은 트랜잭션이 커밋 될 때 (또는 이전에) 자동으로 지속됩니다. 자신이하는 것처럼 명시 적으로 엔티티를 저장할 필요가 없습니다.

  2. from https://stackoverflow.com/questions/16380008/persist-onetoone-relation-with-springdata-jpa by cc-by-sa and MIT license