반응형
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;
}
반응형
'Spring > Spring Data JPA' 카테고리의 다른 글
@OneToOne 양방향 매핑 주키(PK)공유 (0) | 2017.09.27 |
---|---|
Jpa JSON 순환참조 @ResponseBody (0) | 2017.09.21 |
Spring JPA QueryMethod(findBy...deleteBy) (0) | 2016.10.27 |
Spring JPA Hibernate Embeddable(PK composite) (0) | 2015.11.30 |
Spring Data JPA / QueryDSL (0) | 2015.11.17 |