이 글은 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의를 듣고 정리한 글입니다.
@Inheritance(strategy=InheritanceType.XXX)
@Inheritance
의 기본 전략은 단일 테이블 전략이다.
@DiscriminatorColumn(name=”DTYPE”)
: 부모 클래스에 작성. 어떤 엔티티의 것인지 알 수 있는 칼럼.@DiscriminatorValue(”XXX”)
: 자식 클래스에 작성
@DiscriminatorValue(”XXX”)
: 기본적으로 엔티티명이 값으로 들어간다.Movie.java에서 값 변경 & 적용 후
@Entity @DiscriminatorValue("M") // DTYPE 값이 변경된다. public class Movie extends Item { private String director; private String actor; }
@Entity
public abstract class Item { // 추상화 클래스
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
추상화 클래스 (Abstract Class)
Item 클래스를 바로 생성하게 되면 자식이 없이 부모만 존재하게 된다.
다형성을 위해 추상화 클래스로 만들어주는 것이 적절하다.
@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;
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn // 생략 가능하지만, 운영상 있는 것이 좋다.
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Movie movie = new Movie();
movie.setDirector("감독");
movie.setActor("배우");
movie.setName("바람과 함께 사라지다");
movie.setPrice(10000);
em.persist(movie);
em.flush();
em.clear();
// 조회
Movie findMovie = em.find(Movie.class, movie.getId());
System.out.println("findMovie = " + findMovie);
tx.commit();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
} finally {
em.close();
}
emf.close();
}
}
(오류) MOVIE 엔티티에 값이 들어가지 않을 경우
링크를 참고해 pom.xml을 수정한다.→ 하이버네이트 버전을 5.4.13.Final로 수정했다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn // 필수이기 때문에, 생략해도 자동으로 DTYPE이 생성된다.
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
// @DiscriminatorColumn // 의미 X
public abstract class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
Item findItem = em.find(Item.class, movie.getId());
System.out.println("findItem = " + findItem);
@Inheritance(strategy=InheritanceType.XXX)
어노테이션 이외의 소스코드를 변경하지 않아도 되기 때문에 편리하다. @MappedSuperclass
@Entity
클래스는 '엔티티'나 '@MappedSuperclass
로 지정한 클래스'만 상속(extends
) 가능@MappedSuperclass // 매핑 정보만 받는 슈퍼클래스
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
@Entity
public class Member extends BaseEntity { // 상속
// code ...
}
try {
Member member = new Member();
member.setCreatedBy("kim");
member.setCreateDate(LocalDateTime.now());
em.persist(member);
em.flush();
em.clear();
tx.commit();
}