description : only one may be defined as writable all others must be specified read-only
Many To One 매핑에서 자주 발생하는 문제이다..
또한 추가적으로 One쪽 PK가 Many쪽에서도 PK로 사용된다면 JPA 초기 설정된 상태로는 100% 에러난다.
A와 B의 관계가 N:1이면 A와 B의 PK들은 아래의 구조를 가지게 된다.
//MasterCodes.java (A와 B의 관계에선 A, 즉 Many 쪽 table) @EmbeddedId private MasterCodesPK id; //복합키 @Column(name="CODE_NAME") private String codeName; //생략~~ //bi-directional many-to-one association to MasterCodeGroups @ManyToOne(cascade = REFRESH) @JoinColumn(name="CODE_GROUP_SEQ") private MasterCodeGroups masterCodeGroup; // getter / setter 생략~
//MasterCodeGroups.java (A와 B의 관계에선 B, 즉 One에 해당) @Id @Column(name="CODE_GROUP_SEQ") @GeneratedValue(generator = "MASTER_CODE_GROUPS") private int codeGroupSeq; @Column(name="CODE_GROUP_NAME") private String codeGroupName; // 생략~~ //bi-directional many-to-one association to MasterCodes @OneToMany(mappedBy="masterCodeGroup", cascade = REFRESH) private SetmasterCodes; // getter - setter 생략~
위 내용이 JPA로 Table에서 불러와 세팅 된 것인데 이대로 했다가 에러가 빵 뜨더라..;;
그 에러가 제목과 같은 에러인데 -
복합키로 구성될 경우 자신의 PK가 아닌 다른 Table의 PK를 변경할 수 있다면? 있을수 없는 일이다;;
즉 A와 B에서 A의 키는 A_PK, B_PK를 사용하는데 A테이블에서 B_PK를 변경할 수 있다면? 무결성이 깨지게 된다.;;
이때는 차라리 B에서 B_PK가 변경된다면 A에서도 B_PK가 변경되게 제약 조건을 설정하는게 좋다 -
그래서 read-only로 하라는 에러가 나오는 것인데 -
아래와 같이 A테이블에 설정을 더 적어 주어야 한다..
//MasterCodes.java (A와 B의 관계에선 A, 즉 Many 쪽 table) @EmbeddedId private MasterCodesPK id; //복합키 @Column(name="CODE_NAME") private String codeName; //생략~~ //bi-directional many-to-one association to MasterCodeGroups @ManyToOne(cascade = REFRESH) @JoinColumn(name="CODE_GROUP_SEQ", nullable=false, insertable=false, updatable=false) private MasterCodeGroups masterCodeGroup; // getter / setter 생략~
아까와 동일하나 JoinColumn Annotation에 기타 속성이 잔뜩 들어갔다;; 저렇게하면 read-only가 된다.
시간이 없어서 문서를 다 읽어보지 않고 중요 부분만 읽은 후에 썼는데 -
시간 있으신 분은 아래 사이트에서 다 읽어보면 좋을 것 같다.
http://trycatchfinally.blogspot.com/2006/01/mapping-relationships-in-ejb-30.html
'백엔드 > JPA' 카테고리의 다른 글
JPA 예제 및 설명 사이트. (0) | 2012.11.15 |
---|---|
[JPA 따라하기] 3. DB에서 Table 읽어오기. (0) | 2012.11.09 |
[JPA 따라하기] 2. JPA 프로젝트 생성 (0) | 2012.11.09 |
[JPA 따라하기] 1. Sample Database 설치. (0) | 2012.11.09 |
JPA Data Partitioning - Scaling the Database (0) | 2012.11.02 |