Overview

ERD

ERD

์˜๋ฌธ์ 

@Inheritance(strategy=JOINED)์˜ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

Entity Code

package com.example.jpatest.entity;

import jakarta.persistence.*;

import static jakarta.persistence.DiscriminatorType.STRING;
import static jakarta.persistence.InheritanceType.JOINED;

@Entity
@Inheritance(strategy=JOINED) // ๋””ํดํŠธ๋Š” SINGLE_TABLE.
@DiscriminatorColumn(discriminatorType=STRING, name="item_type") // ๋””ํดํŠธ๋Š” DTYPE
public class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String url;
  private Integer price;
}
package com.example.jpatest.entity;

import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;

@Entity
@DiscriminatorValue("prop")
public class Prop extends Item{
  private String propName;
}
package com.example.jpatest.entity;

import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;

@Entity
@DiscriminatorValue("Background")
public class Background extends Item{
  private String backgroundName;
}

์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ์ดํ„ฐ

@MappedSuperClass์˜ ํ…Œ์ด๋ธ” ์ƒ์„ฑ

Entity Code

package com.example.jpatest.entity;

import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
import lombok.Data;

@MappedSuperclass
@Data
public class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String url;
  private Integer price;
}
package com.example.jpatest.entity;

import jakarta.persistence.Entity;
import lombok.Data;

@Entity
@Data
public class Background extends Item{
  private String backgroundName;
}
package com.example.jpatest.entity;

import jakarta.persistence.Entity;
import lombok.Data;

@Entity
@Data
public class Prop extends Item{
  private String propName;
}

์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ์ดํ„ฐ

@Inheritance(strategy=JOINED)์—์„œ ์—ฐ๊ด€ ๊ด€๊ณ„์ธ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ

Example Code

package com.example.jpatest.entity;

import jakarta.persistence.*;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

@Entity
@Data
public class Member {
  @Id
  @GeneratedValue
  private Long id;
  private String nickName;
  private int point;

  @OneToMany(fetch = FetchType.LAZY)
  List<Item> items = new ArrayList<>();

  public void addItem(Item item) {
    this.items.add(item);
  }
}

entityManager

  public void getProps(){
    Member member = entityManager.find(Member.class, 1L);

    List<Item> items = member.getItems(); // Background ์—”ํ‹ฐํ‹ฐ์™€ Prop ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ „๋ถ€ ๊ฐ€์ ธ์˜ด
    List<?> result = items.stream().filter(item -> item instanceof Prop).toList(); // Prop ์—”ํ‹ฐํ‹ฐ๋งŒ ํ•„ํ„ฐ๋ง ๊ฐ€๋Šฅ
  }

JpaRepository

// Item.java
@Entity
@Inheritance(strategy=JOINED) // ๋””ํดํŠธ๋Š” JOINED
@DiscriminatorColumn(discriminatorType=STRING, name="item_type") // ๋””ํดํŠธ๋Š” DTYPE
@Data
public class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String url;
  private Integer price;

  @ManyToOne(fetch = FetchType.LAZY)
  Member member; // Member๊ฐ€ Item๊ณผ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ๊ฑธ๋ ค ์žˆ์œผ๋ฏ€๋กœ, ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์—์„œ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ ํ•จ
}

...

  public void getgetProps(){
    Member member = memberRepository.findById(1L).get();
    
    List<?> result1 = member.getItems().stream().filter(item -> item instanceof Prop).toList(); // Prop ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ…ํ•˜๋ฉด ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
    
    List<Prop> result2 = propRepository.findAllByMember(member); // ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„์—ฌ์•ผ ํ•จ

    List<Item> result3 = itemRepository.findAllByMember(member); // ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์™€ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์˜ ํ•„๋“œ๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Œ
  }

@MappedSuperClass์—์„œ ์—ฐ๊ด€ ๊ด€๊ณ„์ธ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ

Example Code

package com.example.jpatest.entity;

import jakarta.persistence.*;

import java.util.ArrayList;
import java.util.List;

@Entity
public class Member {
  @Id
  @GeneratedValue
  private Long id;
  private String nickName;
  private int point;

//  @OneToMany(fetch = FetchType.LAZY)
//  List<Item> items = new ArrayList<>();  // ์—๋Ÿฌ๋ฐœ์ƒ 'One To Many' attribute value type should not be 'Mapped Superclass'

  @OneToMany(fetch = FetchType.LAZY)
  List<Background> backgrounds = new ArrayList<>();

  @OneToMany(fetch = FetchType.LAZY)
  List<Prop> props = new ArrayList<>();
}

entityManager

  public void getgetProps(){
    Member member = entityManager.find(Member.class, 1L);

    List<Prop> props = member.getProps();
  }

JpaRepository

  public void getProps(){
    Member member = memberRepository.findById(1L).get();

    List<Prop> props = member.getProps();

    // ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋ฉด, ์œ„์˜ ์˜ˆ์‹œ์™€ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ
}  

See Also