Overview
ERD

์๋ฌธ์
- @Inheritance(strategy=JOINED)์ @MappedSuperClass๋ฅผ ์ฌ์ฉํ์ ๋, ๊ฐ๊ฐ์ ๋ํด
- ๋ฌผ๋ฆฌ์ ์ธ ํ ์ด๋ธ์ด ์ด๋ป๊ฒ ์์ฑ๋๋๊ฐ?
- Member ์ํฐํฐ์์ ์ฐ๊ด๊ด๊ณ์ ์๋ Background, Prop ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋๊ฐ?
@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;
}
์์ฑ๋ ํ ์ด๋ธ ๋ฐ ๋ฐ์ดํฐ
ํ ์ด๋ธ

- ์์ ์ํฐํฐ ํ์ ์ ๊ตฌ๋ถํ๊ธฐ ์ํ ์ปฌ๋ผ(์ด ๊ฒฝ์ฐ ITEM_TYPE)์ด ๋ถ๋ชจ ํ ์ด๋ธ์ ์์ฑ๋จ
- ์์ ์ํฐํฐ๊ฐ ๊ฐ๋ณ์ ์ผ๋ก ๊ฐ์ง๋ ์ปฌ๋ผ์, ๊ฐ ์์ ํ ์ด๋ธ์ ๋ณ๋๋ก ์์ฑ๋จ
- ๋ํดํธ ์์ ์ ๋ต(SINGLE_TABLE)์ผ ๊ฒฝ์ฐ, ITEM ํ
์ด๋ธ ํ๋๋ง ์์ฑ๋จ
- ITEM ํ ์ด๋ธ์ PROP_NAME, BACKGROUND_NAME ์ปฌ๋ผ์ด ์ถ๊ฐ๋จ
ํ ์ด๋ธ ๋ณ ๋ฐ์ดํฐ
- ITEM ํ ์ด๋ธ

- BACKGROUND ํ ์ด๋ธ

- PROP ํ ์ด๋ธ

- ์์ ํ ์ด๋ธ์ ๋ถ๋ชจ ํ ์ด๋ธ์ PK๋ฅผ FK๋ก ๋ค๊ณ ์์
@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;
}
์์ฑ๋ ํ ์ด๋ธ ๋ฐ ๋ฐ์ดํฐ
ํ ์ด๋ธ

- ๋ถ๋ชจ ํด๋์ค์ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ์์ ํ ์ด๋ธ์ด ๊ฐ๊ฐ ์์ฑ ๋จ
ํ ์ด๋ธ ๋ณ ๋ฐ์ดํฐ
- BACKGROUND ํ ์ด๋ธ

- PROP ํ ์ด๋ธ

- ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ฐ ์์ฑ๋ผ์ ๋ค์ด๊ฐ
@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();
// ์๋ฐฉํฅ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ค์ ํ๋ฉด, ์์ ์์์ ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์
}