사용자 도구

사이트 도구


java:jpa:map

JPA Map

  • Entity를 Map으로 가질 수도 있고, 일반 값 객체를 Map으로 가질 수도 있다.

Entity Map일 경우, update 발생

  • Entity Map이고, Map의 Key가 자식 Entity의 값의 일부일 경우, 부모측에서 자식객체를 지정한 상태에서 persist를 하면 객체 저장 이후 자식측 데이터에서 parent_id, map_key를 update하는 현상이 발생한다.
  • 예) Parent → Child 맵
    public class Parent {
      // ....
      @OneToMany(cascade = {CascadeType.ALL})
      @JoinColumn(name = "parent_id", nullable = false)
      @MapKeyColumn(name = "map_key")
      private Map<String, Child> children; // children 테이블에 parent_id, map_key 컬럼 존재
    }
    // 이 상황에서 Parent 객체를 children 값까지 다 채워서 persist 하면 insert 후에 update 동반 발생
    // 이미 insert 상황에서 children 테이블의 parent_id, map_key의 채워진 상황.
     
    update children set parent_id=?, map_key=? where child_id=?
  • Parent의 @JoinColumn, @MapKeyColumnupdatable=false로 지정하면 업데이트 안 일어남
      @OneToMany(cascade = {CascadeType.ALL})
      @JoinColumn(name = "parent_id", nullable = false, updatable=false)
      @MapKeyColumn(name = "map_key", updatable=false)
      private Map<String, Child> children;
     
    // 이후 update 안 일어남.
  • 근본적으로 Map의 Key가 Entity에 직접 들어가는 상황이라면 Entity Map 보다는 Embeddable Map이 맞는 것 같다.

참조

java/jpa/map.txt · 마지막으로 수정됨: 2019/04/22 14:37 저자 kwon37xi