잡동사니

Entity의 단일 필드에 다중 @OneToOne 관계 설정 본문

IT/JPA

Entity의 단일 필드에 다중 @OneToOne 관계 설정

yeTi 2022. 5. 23. 18:05

안녕하세요. yeTi입니다.
오늘은 Entity 에서 하나의 필드로 다수의 관계를 가지는 경우에 대해 생각해보려고 합니다.

@OneToOne 관계 설정

GiftEntityUseEntity 에 대해서 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을 한다면 하나의 필드가 가지는 값으로 다수의 테이블과 조인하여 데이터를 만드는것이 자연스럽게 느껴집니다.

하지만 객체 모델링 관점에서 보면 사용에 대한 메타정보 중 하나인 상품 정보와 사용에 대한 메타정보 중 하나인 선물 정보간에 직접적인 관계를 가지도록 하는 것이 불가능한게 아니지만

객체간의 응집도를 낮추는 고려사항에는 맞지 않아 보입니다.

결론

따라서 GiftEntityUseEntity 에 대해서 1:1 관계는 기존 처럼 가져가고 ShopEntity 는 필요 데이터만 조회하는 흐름으로 가져가는게 좋아보입니다.

Comments