시작!
시블관련 자료를 찾아보던중 해당 자료가 있길래 대충 살펴 봄, 이건 ORM! 이란 생각에 JPA로 함 뿌려봤습니다. 고로 Siebel 의 데이터매핑 즉, Entity 매핑을 JPA에 적용하는 방법에 대해서 알아보도록 하겠습니다.
시블 자료 및 이미지 출처 : http://audi.kotev.net/work/Siebel%207%20essentials%20student%20guide%20vol1.pdf
시블 테이블 관계에 들어가기에 앞서..
두번째 말에서 왜!? 에 대한 답변이.
1:M 관계
1:M 관계를 JPA로 표현하는 방법은 몇개가 됩니다. 모든 관계설정에 대해서는 1개씩만 설명하도록 하겠습니다.
우선 위의 ERD에서 보면 상품마스터(S_PROD_INT)와 S_ASSET테이블이 1:M 관계이며 Key로는 PROD_ID 로 되어 있습니다.
--- JAVA ---
@Entity
@Table(name="S_PROD_INT")
public class SProdInt implements Serializable {
@Id
@Column(name="ROW_ID")
private String rowId;
@Column(name="NAME")
private String name;
....
public String getRowId() {
return this.rowId;
}
....getter/setter...
}
@Entity
@Table(name="S_ASSET")
public class SAsset implements Serializable {
@Id
@Column(name="ROW_ID")
private String rowId;
@Column(name="PROD_ID")
private String prodId;
....
public String getRowId() {
return this.rowId;
}
....getter/setter...
}
우선 테이블 매핑 Entity입니다. 관계는 설정되어 있지 않습니다.
이제 1:M을 갖도록 S_PROD_INT에 먼저 설정합니다. 밑 소스 참조.
@Entity
@Table(name="S_PROD_INT")
public class SProdInt implements Serializable {
@Id
@Column(name="ROW_ID")
private String rowId;
@Column(name="NAME")
private String name;
@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="sProdInt")
private List<SAsset> sAssets;
....
public String getRowId() {
return this.rowId;
}
....
public List<SAsset> getSAssets(){
return this.sAssets;
}
public void setSAssets( List<SAsset> sAssets ){
this.sAssets = sAssets;
}
....getter/setter...
}
S_ASSET 의 위치에서 본다면 M:1 이 되므로 이부분도 지정해 줍니다.
@Entity
@Table(name="S_ASSET")
public class SAsset implements Serializable {
@Id
@Column(name="ROW_ID")
private String rowId;
@Column(name="PROD_ID")
private String prodId;
@ManyToOne
@JoinColumn(referencedColumnName="ROW_ID", name="PROD_ID")
private SProdInt sProdInt;
....
public String getRowId() {
return this.rowId;
}
....
public void setSProdInt(SProdInt sProdInt) {
this.sProdInt = sProdInt;
}
public SProdInt getSProdInt() {
return sProdInt;
}
....getter/setter...
}
이렇게 지정을 하면 전에 학습실에서 보셨던 결과가 나옵니다. But, 관계에서 자식테이블의 데이터를 등록하면서 부모테이블을 Update/Insert/Delete 한다는 것은 어찌보면 경고사항이므로 단순히 예제 샘플로 처리하려 하면 Exception을 볼 수 도 있습니다.
M:M 관계
이번에는 M:M 관계를 풀어 보도록 하겠습니다.
보시는 ERD와 같이 M:M에서는 교차테이블이 존재합니다. - 기본적인 M:M이(교차테이블이 없는) ERD가 있다면 그냥 @ManyToMany로 설정하십시요.
SProdInt Entity에 1:M 관계로 Intersetion Table에 매핑을 설정합니다.
@Entity
@Table(name="S_PROD_INT")
public class SProdInt implements Serializable {
@Id
@Column(name="ROW_ID")
private String rowId;
@Column(name="NAME")
private String name;
@ManyToMany
@JointTable( name = "S_PROD_LN_PROD",
jointColumns=@JoinColumn(name="PROD_ID"),
inverseJoinColumns=@JoinColumn(name="PROD_LN_ID"))
private Collection<SProdLn> sProdLns;
....
public String getRowId() {
return this.rowId;
}
....
public Collection<SProdLn> getSProdLns(){
return this.sProdLns;
}
public void setSProdLns( Collection<SProdLn> sProdLns){
this.sProdLns= sProdLns;
}
....getter/setter...
}
마찬가지로 SProdLn Entity도 같은 형태가 됩니다.
1:1 관계 - Standard
다음 포스팅에
1:1 관계 - Extends
다음 포스팅에
시블에서 주로 사용되는 1개의 Table의 Column값에 따른 여러개의 Entity
다음 포스팅에
전반적으로 좀 단순하게 매핑을 해봤습니다. 사실 깊숙히 들어가면 무섭기 땜시 어느선에서는 좀 돌아서가면 깊숙하게 매핑처리는 하지 않아도 될듯 합니다. - 구조 자체가 ORM형태입니다.