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들은 아래의 구조를 가지게 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //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 생략~ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //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 Set<mastercodes> masterCodes; // getter - setter 생략~ </mastercodes> |
위 내용이 JPA로 Table에서 불러와 세팅 된 것인데 이대로 했다가 에러가 빵 뜨더라..;;
그 에러가 제목과 같은 에러인데 -
복합키로 구성될 경우 자신의 PK가 아닌 다른 Table의 PK를 변경할 수 있다면? 있을수 없는 일이다;;
즉 A와 B에서 A의 키는 A_PK, B_PK를 사용하는데 A테이블에서 B_PK를 변경할 수 있다면? 무결성이 깨지게 된다.;;
이때는 차라리 B에서 B_PK가 변경된다면 A에서도 B_PK가 변경되게 제약 조건을 설정하는게 좋다 -
그래서 read-only로 하라는 에러가 나오는 것인데 -
아래와 같이 A테이블에 설정을 더 적어 주어야 한다..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //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 |