잡동사니
Entity의 단일 필드에 다중 @OneToOne 관계 설정 본문
안녕하세요. yeTi입니다.
오늘은 Entity 에서 하나의 필드로 다수의 관계를 가지는 경우에 대해 생각해보려고 합니다.
@OneToOne 관계 설정
GiftEntity
와 UseEntity
에 대해서 1:1 관계설정을 다음과 같이 설정했습니다.
public class GiftEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", length = 20, nullable = false, columnDefinition = "BIGINT(20)")
private Long id;
...
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "useSeq")
private UseEntity useEntity;
...
}
public class UseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", length = 20, nullable = false, columnDefinition = "BIGINT(20)")
private Long id;
...
}
다수의 @OneToOne 관계 설정
이 후 상품정보가 필요하여 ShopEntity
의 관계를 추가했습니다.
public class GiftEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", length = 20, nullable = false, columnDefinition = "BIGINT(20)")
private Long id;
...
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "useSeq")
private UseEntity useEntity;
@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "usedSeq")
private ShopEntity shopEntity;
...
}
public class UseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", length = 20, nullable = false, columnDefinition = "BIGINT(20)")
private Long id;
...
}
public class ShopEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", length = 20, nullable = false, columnDefinition = "BIGINT(20)")
private Long id;
...
}
그랬더니 다음과 같은 오류가 발생했습니다.
Repeated column in mapping for entity: ...GiftEntity column: usedSeq (should be mapped with insert="false" update="false")
Repeated column in mapping for entity 오류
JPA 에서는 DB 컬럼과 Entity 필드를 1:1 맵핑하도록 되어있습니다.
여기에 관계를 설정하면 관계 설정을 위한 Entity 필드를 맵핑해줘야 하는데요.
하나의 Entity 필드에 다수의 관계를 설정하는 경우 Read-Only 필드로 설정하라는 오류를 발생시킵니다.
이 부분이 관점에 따라 이상하게 느껴질 수도 있습니다.
SQL 관점에서는 JOIN을 한다면 하나의 필드가 가지는 값으로 다수의 테이블과 조인하여 데이터를 만드는것이 자연스럽게 느껴집니다.
하지만 객체 모델링 관점에서 보면 사용에 대한 메타정보 중 하나인 상품 정보와 사용에 대한 메타정보 중 하나인 선물 정보간에 직접적인 관계를 가지도록 하는 것이 불가능한게 아니지만
객체간의 응집도를 낮추는 고려사항에는 맞지 않아 보입니다.
결론
따라서 GiftEntity
와 UseEntity
에 대해서 1:1 관계는 기존 처럼 가져가고 ShopEntity
는 필요 데이터만 조회하는 흐름으로 가져가는게 좋아보입니다.
'IT > JPA' 카테고리의 다른 글
Fetch join의 대상은 on, where 등에서 필터링 조건으로 사용하면 안됩니다. (0) | 2022.06.27 |
---|---|
JPA 추전 강좌, 자바 ORM 표준 JPA 프로그래밍 - 기본편 내용 정리 및 후기 (0) | 2019.12.13 |
Comments