๋ชฉ์ฐจ
๊ฐ์ฒด์ ์์๊ด๊ณ
extends๋ก ์ง์ํด์ค๋ค.
@Entity
public class Item {
@Id @GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
}
@Entity
public class Album extends Item{
private String artist;
}
@Entity
public class Movie extends Item{
private String director;
private String actor;
}
@Entity
public class Book extends Item{
private String author;
private String isbn;
}
DB์์ ์ํผํ์ -์๋ธํ์ ๋ชจ๋ธ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์๊ด๊ณ๊ฐ ์์ง๋ง
์์๊ณผ ์ ์ฌํ ์ํผํ์ -์๋ธํ์ ๋ชจ๋ธ๋ง ๊ธฐ๋ฒ์ด ์๋ค.
JPA์์๋ ์๋ 3๊ฐ์ง๋ฅผ ๋ชจ๋ ์ง์ํด์ฃผ๋ฉฐ, @Inheritance ์ด๋ ธํ ์ด์ ์ผ๋ก ํํํ ์ ์๋ค.
1. ํตํฉ ํ ์ด๋ธ๋ก ๋ง๋ค์ด ์กฐ์ธ์์ด ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ค๋ ๋ฐฉ๋ฒ
์ฅ์ : ์กฐ์ธ์ด ์์ด์ ์กฐํ ์ฑ๋ฅ์ด ๋น ๋ฅด๋ค.
๋จ์ : ์์ ์ํฐํฐ๊ฐ ๋งคํํ ์ปฌ๋ผ์ ๋ชจ๋ null์ด ํ์ฉ๋๋ค.
ํ ์ด๋ธ์ด ๋๋ฌด ์ปค์ง ์ ์๋ค. ์ํฉ์ ๋ฐ๋ผ์๋ ์กฐํ ์ฑ๋ฅ์ด ์คํ๋ ค ๋๋ ค์ง ์ ์๋ค.
JPA์์ ๊ธฐ๋ณธ์ ๋ต์ด๋ค. Item ์ํฐํฐ์ @Entity๋ง ์ฌ์ฉํ๊ฑฐ๋
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) ๋ก ์ง์ ํ ๊ฒฝ์ฐ์ ํตํฉ ํ ์ด๋ธ๋ก ๋ง๋ค์ด์ค๋ค.
2. ๊ฐ๊ฐ์ ํ ์ด๋ธ๋ก ๋๋๋ ํ ์ด๋ธ๋ง๋ค ์ปฌ๋ผ์ ์ค๋ณตํ๋ ๋ฐฉ๋ฒ
์ฅ์ : ํตํฉ ํ ์ด๋ธ๋ณด๋ค ํ ์ด๋ธ์ด ๋๋์ด์ ธ ์ปฌ๋ผ์ not null์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๋ค.
๋จ์ : ๊ฐ์ฒด์งํฅ์์๋ Item์ผ๋ก Album, Book, Movie๋ฅผ ์กฐํํ ์ ์๋ค.
ํ์ง๋ง ๊ฐ ํ ์ด๋ธ๋ง๋ค ๋๋์ด์ง ์ํ์์ Item์ผ๋ก ์กฐํํ๊ฒ๋๋ฉด
๋ชจ๋ ํ ์ด๋ธ์ ์กฐํํด์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ผํ๋ค(Union SQLํ์)
=> DB์ค๊ณ์, ORM ์ ๋ฌธ๊ฐ ๋ชจ๋ ์ถ์ฒํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค!!
Item์ํฐํฐ์ @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)๋ก ์ง์ ํด์ค๋ค.
๊ฐ์ฒด์์๋ Item์ํฐํฐ์ abstract ํค์๋๋ฅผ ๋ถ์ฌ์ ์ถ์ํด๋์ค๋ก ๋ง๋ค์ด์ค๋ค.
๊ทธ๋ฌ๋ฉด extends๋ฅผ ์ฌ์ฉํ๋ฉด์, Itemํ ์ด๋ธ์ ์์ฑ๋์ง ์๋๋ค.
3. ๊ฐ๊ฐ์ ํ ์ด๋ธ๋ก ๋๋๋ ์ค๋ณต ์ปฌ๋ผ์ ๊ณตํต ํ ์ด๋ธ๋ก ๋ถ๋ฆฌํ๊ณ ์กฐ์ธ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ค๋ ๋ฐฉ๋ฒ
์ฅ์ : ์ ๊ทํ๋ฅผ ํตํด ์ ์ฅ๊ณต๊ฐ์ด ํจ์จํ๋๋ค.
๋จ์ : ์กฐํ ์ ์กฐ์ธ์ ๋ง์ด ์ฌ์ฉํ๊ฒ๋์ด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
๋ฐ์ดํฐ ์ ์ฅ ์ Insert๋ฌธ์ 2๋ฒ ํธ์ถํ๋ค.
Item์ํฐํฐ์ @Inheritance(strategy = InheritanceType.JOINED)๋ก ์ง์ ํด์ค๋ค.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item {
@Id @GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
}
@Entity
public class Movie extends Item{
private String director;
private String actor;
}
Movie movie = new Movie();
movie.setName("์๋ฐํ");
movie.setPrice(10000);
movie.setStockQuantity(10);
movie.setActor("๋ฐฐ์ฐ");
movie.setDirector("์๊ฐ");
em.persist(movie);
@DiscriminatorColumn
๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์กฐํํ์ ๋, item์ ์ ๋ ฅ๋ ๊ฐ์ด ์์์ธ album, book, movie ์ค ์ด๋ค ๊ฒ์ ์ํด ์์ฑ๋์๋์ง๋ฅผ ํ์ํด์ฃผ๋ ์ปฌ๋ผ์ ์ถ๊ฐํด์ค๋ค.
๋ถ๋ชจ ํ ์ด๋ธ์ ์ค์ ํ๋ค.
@DiscriminatorColumn์ ์ค์ ํ์ ๋ ์๊ธฐ๋ ์ปฌ๋ผ์ ๊ธฐ๋ณธ๋ช ์ DTYPE์ผ๋ก, (name = "~")์ผ๋ก ์ปฌ๋ผ๋ช ์ ๋ณ๊ฒฝํ ์ ์๋ค.
DTYPE์ ๋ค์ด๊ฐ๋ ๊ธฐ๋ณธ๊ฐ์ ์ํฐํฐ๋ช ์ด๋ค.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
}
@Entity
public class Movie extends Item{
private String director;
private String actor;
}
@DiscriminatorValue
@DiscriminatorColumn์ ์ ๋ ฅ๋๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์์ํ ์ด๋ธ์ ์ค์ ํ๋ค.
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public class Item {
@Id @GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item{
private String director;
private String actor;
}
@MappedSuperclass
๊ธฐ๋ณธ์ ์ผ๋ก ํ์ํ createdBy, createTime, updatedBy... ๋ฑ๋ฑ ๋ชจ๋ ์ํฐํฐ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ์ปฌ๋ผ๋ค์ ๊ฒฝ์ฐ
BaseEntity๋ฅผ ์์ฑํ ํ ํด๋น ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค๋ค.
์ฃผ์! @MappedSuperclass๋ ์์๊ด๊ณ ๋งคํ์ด ์๋๋ค.
์์ ํด๋์ค์ ์ปฌ๋ผ์ ๋ณด๋ง ์ ๊ณตํด์ฃผ๋ ๊ฒ์ด๋ค.
์ง์ ์์ฑํด์ ์ฌ์ฉํ ์ผ์ด ์์ผ๋ฏ๋ก ์ถ์ ํด๋์ค๋ฅผ ๊ถ์ฅํ๋ค.
@MappedSuperclass
public abstract class BaseEntity {
private String createBy;
@Column(name = "updateBy")
private String update;
}
@Entity
public class Member extends BaseEntity {
@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
}
'๐พ Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ฐ ํ์ (๊ธฐ๋ณธ๊ฐ, @Embedded, ๊ฐํ์ ์ปฌ๋ ์ ) (0) | 2022.02.22 |
---|---|
[JPA] ํ๋ก์์ ์ฆ์๋ก๋ฉ, ์ง์ฐ๋ก๋ฉ / ์์์ฑ ์ ์ด์ ๊ณ ์๊ฐ์ฒด (0) | 2022.02.21 |
[JPA] ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ(๋ค๋์ผ, ์ผ๋์ผ, ๋ค๋๋ค) (0) | 2022.02.21 |
[JPA]์์์ฑ ๊ด๋ฆฌ : ๋ด๋ถ ๋์ ๋ฐฉ์ (0) | 2022.02.21 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2022.02.20 |