티스토리 뷰

728x90

0. 이 포스트는 상속 매핑의 Mapped Superclass 정책에 대해서 작성한다.

 

1. Mapped Superclass 정책

  1-1 자식 클래스만 @Entity로 수식되고 테이블로 전환된다.

  1-2 자식 클래스는 상속받은 field 까지 테이블에 저장한다.

  1-3 부모 클래스는 Entity가 아니므로 부모클래스를 받아 올 때는 HQL 같은 별도의 작업이 필요하다.

 

2. 장점과 단점

  2-1 장점

    2-1-1 간단하고 단순한 구현이다.

    2-1-2 상속 구조 자체가 없기 때문에 속도가 빠르다. 다만 부모 클래스 객체를 만들기 까다롭다.

      2-1-2-1 부모 클래스를 사용하려면 abstract를 제거해야 생성이 가능하고 query를 별도로 작성한다.

  2-2 단점

    2-2-1 부모를 받기 위해서는 HQL을 별도로 사용해야 한다.

 

3. Mapped Superclass 정책을 사용하려면 아래의 설정이 필요하다.

  3-1 부모클래스의 상속 설정에서 Joined Table 정책을 지정한다. 별도의 annotaion이 있다.

 

@MappedSuperclass

 

    3-1-1 @MappedSuperclass는 이 클래스를 정책이 상속받는 클래스에 그대로 옮겨간다는 의미다.

    3-1-2 부모 클래스의 Entity는 생성되지 않는다.

  3-2 부모클래스의 id생성 방식은 일반적인 identity로 정하면 된다.

  3-3 부모클래스는 더 이상 Entity가 아니므로 @Entity, @Table, @Inheritance를 삭제한다.

 

4. Entity 구현

  4-1 User 부모 클래스

    4-1-1 lombok 설정만 빼면 @MappedSuperclass 밖에 남지 않았다.

 

package pe.pilseong.mappedsuper.entity;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

import lombok.Data;
import lombok.NoArgsConstructor;

@MappedSuperclass
@Data
@NoArgsConstructor
public abstract class User {
  
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  
  @Column(name = "firstName")
  private String firstName;
  
  @Column(name = "lastName")
  private String lastName;
  
  @Column(name = "email")
  private String email;

  public User(String firstName, String lastName, String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
  }
}

 

  4-2 Student Entity (지난 포스트와 동일하다.)

 

package pe.pilseong.mappedsuper.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Table;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "student")
@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
public class Student extends User {

  @Enumerated(EnumType.STRING)
  @Column(name = "schoo_level")
  private Level level;
  
  @Column(name = "course")
  private String course;

  public Student(String firstName, String lastName, String email, Level level, String course) {
    super(firstName, lastName, email);
    this.level = level;
    this.course = course;
  }
}

 

  4-3 Teacher Entity (지난 포스트와 동일하다.)

 

package pe.pilseong.mappedsuper.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;

import lombok.Data;
import lombok.EqualsAndHashCode;

@Entity
@Table(name = "teacher")
@Data
@EqualsAndHashCode(callSuper=false)
public class Teacher extends User {

  @Column(name = "salary")
  private Double salary;

  public Teacher(String firstName, String lastName, String email, Double salary) {
    super(firstName, lastName, email);
    this.salary = salary;
  }  
}

 

5. 실행 결과

  5-1 실행 코드 (지난 포스트와 동일하다)

 

package pe.pilseong.mappedsuper;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import pe.pilseong.mappedsuper.entity.Level;
import pe.pilseong.mappedsuper.entity.Student;
import pe.pilseong.mappedsuper.entity.Teacher;
import pe.pilseong.mappedsuper.entity.User;

/**
 * Hello world!
 *
 */
public class App {
  public static void main(String[] args) {
    SessionFactory factory = new Configuration().configure()
        .addAnnotatedClass(User.class)
        .addAnnotatedClass(Student.class)
        .addAnnotatedClass(Teacher.class)
        .buildSessionFactory();
    
    Session session = factory.getCurrentSession();
    session.beginTransaction();
    
    Student student = new Student("Pilseong", "Heo", "heops79@gmail.com", Level.TERIARY, "Software Engineering");
    Teacher teacher = new Teacher("Suel", "Heo", "suel@gmai.com", 1000000D);
   
    session.save(student);
    session.save(teacher);
    
    session.getTransaction().commit();
    
    factory.close();
    
  }
}

 

  5-2 생성 테이블

 

 

  5-3 테이블 구조

    5-3-1 아무런 관계가 없는 두 개의 테이블이 만들어 졌다.

    5-3-2 id값도 각자 생성된다.

 

 

  5-4 테이블 값 - 두 테이블 모두 별도의 id가 생성된다.

    5-4-1 학생 테이블 

 

 

 

    5-4-2 교사 테이블

 

 

728x90
댓글