====== 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 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'', ''@MapKeyColumn''을 ''updatable=false''로 지정하면 업데이트 안 일어남 @OneToMany(cascade = {CascadeType.ALL}) @JoinColumn(name = "parent_id", nullable = false, updatable=false) @MapKeyColumn(name = "map_key", updatable=false) private Map children; // 이후 update 안 일어남. * **근본적으로 Map의 Key가 Entity에 직접 들어가는 상황이라면 Entity Map 보다는 Embeddable Map이 맞는 것 같다**. ===== 참조 ===== * [[https://baeldung.com/hibernate-persisting-maps|Persisting Maps with Hibernate | Baeldung]]