본문 바로가기
Spring/Spring Data JPA

mybatis association, inner class , embeded

by 아이티.파머 2021. 4. 29.
반응형

mybatis association, inner class , embeded

innerclass를 이요해서 mybatis 의 Obejct 맵팽을 위해서는 다음과 같이 사용 할 수 있다.

특히 JPA 사용사 멀티 PK를 사용한 Entity 를 사용시 @embeded 를 이요한 내부 Class 를 이용할때 혹은 객체를 이용할때 association tag는 유용하다.

innnerClass 선택은 xml 에서 $을 . 대신에 사용해 준다.

Entity Class 생성

AdsEntityPK 를 내부 Class로 가지고 있다.

@Entity
@Table(name = "ads")
@Getter@Setter
@EqualsAndHashCode(callSuper = true, exclude = {"adGroupEntity"})
@ToString(exclude = {"adGroupEntity"}, callSuper = true)
public class AdsEntity extends AbstractCommonMetaEntity implements Serializable {
  /**
   * serialVersionUID.
   */
  private static final long serialVersionUID = 1L;

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

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

    /**
     * 캠페인 아이디.
     */
    private String campaignId;

    /** 미디어 아이디 ( 구글, 페이스북....). */
    private String mediaId;

    /** 광고 그룹 아이디. */
    private String adGroupId;

    /**
     * 광고 아이디.
     */
    private String adId;

  }

  @EmbeddedId private AdsEntityPK adsEntityPK;

  /**
   * 목표(캠페인 타입 : 동영상 / 배너 / 검색).
   */
  private String objective;

  /**
   * 소재 아이디.
   */
  private String creativeId;

  /**
   * 광고 이름.
   */
  private String adName;

  /**
   * 상태 (유효/삭제/일시정지/보관).
   */
  private String status;

  /** 광고계정. */
  private String customId;

  private Date startTime;
  private Date endTime;
  /**
   * 지면 플랫폼 정보(유트브/검색/앱/페이스북/인스타/배너).
   */
  private String adNetworkType;

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

  /**
   * 광고 그룹 정보 모델 클래스.
   */
  @MapsId("adGroupEntityPK")
  @ManyToOne(fetch = FetchType.LAZY, targetEntity = AdGroupEntity.class)
  @JoinColumns({
      @JoinColumn(name = "campaignId", updatable = false, insertable = false, referencedColumnName = "campaignId"),
      @JoinColumn(name = "mediaId", updatable = false, insertable = false, referencedColumnName = "mediaId"),
      @JoinColumn(name = "adGroupId", updatable = false, insertable = false, referencedColumnName = "adGroupId"),
  })
  private AdGroupEntity adGroupEntity;

Mybatis Mapper XML 생성

resultMap Tag를 이용하여 id="adsEntityPK" 를 만들어주고 innerClass 사용은 $ 을 이용하여 선택해준다. 이후 사용하고자하는 select tag 에 resultMap을 생성한뒤

association Tag에 resultMap 을 Mapping 시켜준다.

  • perperty : Class 에정의된 attribute 의 alias 값 일치 하도록
  • resultMap : 미리정의한 id="adsEntityPK" 의 id 값
<resultMap id="adsEntity" type="com.cjenm.report.library.domain.entity.AdsEntity">
    <association property="adsEntityPK" resultMap="adsEntityPK"/>
</resultMap>

위와 같이 작성해 주어도 autoMapping="true" 가 기본 값임 으로 result를 별도로 적어 주지 않아도 자동 Mapping 된다. (필드명과 다르다면 column 과 class의 field 를 매핑 시켜주어야 한다)

mybatis association tag 및 collection tag는 ORM 형태로 사용하기 위해 사용한다.

Mapper xml 전체

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cjenm.report.library.repository.mybatis.AdCreativeMapper">
    <resultMap id="adsEntityPK" type="com.cjenm.report.library.domain.entity.AdsEntity$AdsEntityPK">
        <result property="campaignId" column="campaign_id"/>
        <result property="mediaId" column="media_id"/>
        <result property="adGroupId" column="ad_group_id"/>
        <result property="adId" column="ad_Id"/>
    </resultMap>

    <resultMap id="adsEntity" type="com.cjenm.report.library.domain.entity.AdsEntity">
        <association property="adsEntityPK" resultMap="adsEntityPK"/>
    </resultMap>


    <select id="findAllByCampaignId" parameterType="Map"  resultMap="adsEntity">
        SELECT
            `ad_id`,
            `creative_id`,
            `ad_name`,
            `status`,
            `ad_group_id`,
            `campaign_id`,
            `media_id`,
            `custom_id`,
            `master_id`,
            `ad_network_type`,
            `objective`,
            `start_time`,
            `end_time`,
            `initial_collect_date`,
            `last_collect_date`
        FROM `ae_report`.`ads`
        WHERE 1=1
        AND campaign_id in
        <foreach collection="list" item="campaignIds" separator="," open="(" close=")">
            #{campaignIds}
        </foreach>
        AND media_id = #{mediaId}
    </select>
</mapper>
반응형