본문 바로가기

Programming!

시블(SIEBEL) 데이터 매핑을 JPA로 P_01


시작!
시블관련 자료를 찾아보던중 해당 자료가 있길래 대충 살펴 봄, 이건 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형태입니다.