patient와 income을 매핑해놓고, income에 name 컬럼을 두는 것은 좋은 설계가 아니라는 생각이 들었다.
그러면 복합키로 설정하면, 이 문제가 해결될 것으로 생각하고 우선 income 테이블의 name 컬럼을 삭제하고 복합키 설정을 했다.
@Entity
@Table(name = "patient", uniqueConstraints = { @UniqueConstraint(name = "UniqueNameAndBirthday", columnNames = { "name", "birthday" }) })
public class Patient {
@OneToMany(mappedBy = "patient", fetch = FetchType.LAZY)
private List<Income> incomes = new ArrayList<>();
}
일대다 관계인 환자 테이블에는 fetch를 LAZY로 추가해줬다.
@Entity
@Table(name = "income")
public class Income {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns(value = {
@JoinColumn(name = "patient_id", referencedColumnName = "id"),
@JoinColumn(name = "patient_name", referencedColumnName = "name"),
@JoinColumn(name = "patient_birthday", referencedColumnName = "birthday")
} , foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
private Patient patient;
}
다대일 관계인 매출 테이블에는 JoinColumns에 정보를 추가해줬다.
다시 생각하니, 복합키로 매핑할 필요가 없고
DTO에서만 이름, 생일을 받아서 충분히 처리가 가능한 상황이다..
심지어 매핑한 부분으로 로직이 건들여지는 부분도 없어...!!
그래서 코드에서는 이 내용을 삭제했지만, 좋은 학습이였다~~
참고한 블로그 및 사이트
https://www.baeldung.com/jpa-join-column
https://minssan9.tistory.com/m/42