====== 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]]