본문 바로가기
Spring/Spring Data JPA

JPA foreign key 생성(@MapsId @ManyToOne)

by 아이티.파머 2016. 11. 29.
반응형

JPA 에서 Forin Key 를 생성해 보자

 

 

 

클레스 다이어 그램으로 구조를 한눈에 먼저 확인하자

MediaManagementEntity 

  • 미디어 정보를 가진 엔티티 클레스

CampaignEntity          

  • 캠페인 정보를 가진 클레스
  • 미디어 정보를 가진 클레스와 FK를 맺어  미디어 정보를 확인한다.
  • 애드그룹 엔티티와 1:N 관계

AdGroupEntity

  • 애드그룹 정보를 가진 클레스
  • 캠페인 엔티티와 N:0..1 관계

 

 

 

 

 

 

@JoinColumn

@JoinColumn 을 이용하여 조인 한다.

  • name="자식 테이블의 컬럼 명, 자기 자신의 컬럼명"
  • referencedColumnName="조인 대상 부모의 컬럼명"

@JoinColumn (name="concertOrderId", referencedColumnName="concertOrderId" )

 

ToString 및 JSON 객체로 직열화 시에 순환참조가 이루어져 OOM이 발생될수 있음으로 주의 하여 사용한다.

@ToString(exclude = {"campaignEntity", "adsEntities"}, callSuper = true)

 

 

/**
   * 캠페인 기본 정보.
   */
  @MapsId("campaignPK")
  @ManyToOne(fetch = FetchType.LAZY, targetEntity = CampaignEntity.class)
  @JoinColumns({
      @JoinColumn(name = "campaignId", updatable = false, insertable = false, referencedColumnName = "campaignId"),
      @JoinColumn(name = "mediaId", updatable = false, insertable = false, referencedColumnName = "mediaId")
  })
  private CampaignEntity campaignEntity;

@EmbeddedId, @Embeddable로  multi PK 를 사용하는 경우 @MasId로 연결한다.

ManyToOne, OneToMany  @Annotation 사용시 클레스 기준으로 선언한다. 

AdGroupEntity 기준에서 CampaignEntity는 @ManyToOne 이 된다. (N:1)

 

 

예제 

1. MediaManagementEntity

@Entity
@Table(name = "media_management")
@Getter
@Setter
@EqualsAndHashCode
@ToString
@Data
public class MediaManagementEntity implements Serializable {

  /**
   * serialVersionUID.
   */
  private static final long serialVersionUID = 1L;
  
  @Id
  @Column(unique = true)
  private String mediaId;

  private String mediaName;
  private String apiType;
  private boolean useYn;


}

 

1. CampaignEntity

@Entity
@Getter
@Setter
@Table(name = "campaign")
@ToString(exclude = "mediaManagementEntity", callSuper = true)
@EqualsAndHashCode(callSuper = true, exclude = {"mediaManagementEntity"})
public class CampaignEntity extends AbstractCommonMetaEntity implements Serializable {

  /**
   * serialVersionUID.
   */
  private static final long serialVersionUID = 1L;

  @Embeddable
  @Getter
  @Setter
  @EqualsAndHashCode
  @ToString
  public static class CampaignPK implements Serializable {

    /**
     * serialVersionUID.
     */
    private static final long serialVersionUID = 1L;

    private String campaignId;
    private String mediaId;

    public CampaignPK(String campaignId, String mediaId) {
      this.campaignId = campaignId;
      this.mediaId = mediaId;
    }

    public CampaignPK() {
    }
  }

  @EmbeddedId
  private CampaignPK campaignPK;
 
  private String campaignName;
  private String objective;
  private String adNetworkType;
  private String status;
  private Date createdTime;
  private Date startTime;
  private Date endTime;
  private String customId;

  ///////////////////////////////////////////
  //Association 설정
  ///////////////////////////////////////////

  @ManyToOne(fetch = FetchType.LAZY, optional = true)
  @JoinColumn(name = "mediaId", insertable = false, updatable = false, referencedColumnName = "mediaId")
  private MediaManagementEntity mediaManagementEntity;


}

 

 

3. AdGroup Entity

@Entity
@Getter
@Setter
@EqualsAndHashCode(callSuper = true, exclude = {"campaignEntity", "adsEntities"})
@Table(name = "ad_group")
@ToString(exclude = {"campaignEntity", "adsEntities"}, callSuper = true)
public class AdGroupEntity extends AbstractCommonMetaEntity implements Serializable {

  /**
   * serialVersionUID.
   */
  private static final long serialVersionUID = 1L;


  @Getter
  @Setter
  @EqualsAndHashCode
  @Embeddable
  public static class AdGroupEntityPK implements Serializable {

    /**
     * serialVersionUID.
     */
    private static final long serialVersionUID = 1L;
    private String campaignId;
    private String mediaId;
    private String adGroupId;

  }

  @EmbeddedId
  private AdGroupEntityPK adGroupEntityPK;
  private String adGroupName;
  private Date startTime;
  private Date endTime;
  private String objective;
  private String adNetworkType;
  private String customId;
  private String status;

  @Transient
  private Set<AdGroupInsightDaily> adgroupInsightDailySet;

  
  public AdGroupEntity() {
    this.adgroupInsightDailySet = new HashSet<AdGroupInsightDaily>();
    //this.adsSet = new HashSet<Ads>();
  }

  ///////////////////////////////////////////
  //Association 설정
  ///////////////////////////////////////////

  /**
   * 캠페인 기본 정보.
   */
  @MapsId("campaignPK")
  @ManyToOne(fetch = FetchType.LAZY, targetEntity = CampaignEntity.class)
  @JoinColumns({
      @JoinColumn(name = "campaignId", updatable = false, insertable = false, referencedColumnName = "campaignId"),
      @JoinColumn(name = "mediaId", updatable = false, insertable = false, referencedColumnName = "mediaId")
  })
  private CampaignEntity campaignEntity;

  
  @OneToMany(mappedBy = "adGroupEntity", fetch = FetchType.LAZY)
  private Set<AdsEntity> adsEntities;

}
반응형