티스토리 뷰

공부/JPA

@MappedSuperclass

kd0547 2022. 12. 2. 21:41

@MappedSuperclass

  • 객체에서 공통 매핑 정보가 필요할 때 사용한다. 
  • 부모 클래스는 매핑하지 않고 상속받는 자식 클래스에게 매핑 정보만 제공하고 싶을 때 사용한다. 

 

@MappedSuperclass 특징 정리

  • 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용한다. 
  • @MappedSuperclass로 지정한 클래스는 엔티티가 아니므로 em.find() 나 JPQL에서 사용할 수 없다. 
  • 이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장한다. 

 

 

 

상속관계 매핑과 차이점  

 

 

상속관계 매핑의 객체와 테이블 

 

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name="DTYPE")
public abstract class Item {
	
	@Id @GeneratedValue(strategy = GenerationType.AUTO,generator = "Item_SEQ")
	@Column(name = "ITEM_ID")
	private Long id;
	
	private String name;
	
	private int price;
	
	private String dtype;
}

 

@Entity
@DiscriminatorValue("Book")
@PrimaryKeyJoinColumn(name="BOOK_ID")
public class Book extends Item{
	private String author;
	private String isbn;
}

[item 테이블]

[book 테이블]

itme 테이블과 book 테이블이 만들어지고 각각의 테이블에 insert와 select가 실행됩니다. 

 

//insert
Hibernate: 
    /* insert com.study.jpa.entity.Book
        */ insert 
        into
            Item
            (name, price, DTYPE, ITEM_ID) 
        values
            (?, ?, 'Book', ?)
            
Hibernate: 
    /* insert com.study.jpa.entity.Book
        */ insert 
        into
            Book
            (author, isbn, BOOK_ID) 
        values
            (?, ?, ?)
//select
Hibernate: 
    /* select
        b 
    from
        Book b */ select
            book0_.ITEM_ID as item_id2_3_,
            book0_1_.name as name3_3_,
            book0_1_.price as price4_3_,
            book0_.author as author1_1_,
            book0_.isbn as isbn2_1_ 
        from
            Book book0_ 
        inner join
            Item book0_1_ 
                on book0_.ITEM_ID=book0_1_.ITEM_ID

 

 

@MappedSuperclass 의 객체와 테이블 

 

[BaseEntity]

@MappedSuperclass
public class BaseEntity {
	private String createdBy;
	private LocalDateTime createdDate;
	private String lastModifiedBy;
	private LocalDateTime lastModifiedDate;
	
}

BaseEntity는 테이블과 매핑할 필요 없고 자식 엔티티에게 공통으로 사용되는 매핑 정보만 제공하고 있습니다. 

 

 

[Member]

@Entity
public class Member extends BaseEntity{
	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	private String name;
	
	private String email;


}

 

 

[Member 테이블]

Hibernate: 
    create table member (
       id bigint not null,
        created_by varchar(255),
        created_date datetime,
        last_modified_by varchar(255),
        last_modified_date datetime,
        email varchar(255),
        name varchar(255),
        primary key (id)
    ) engine=InnoDB
    
//insert
Hibernate: 
    /* insert com.study.jpa.entity.Member
        */ insert 
        into
            Member
            (createdBy, createdDate, lastModifiedBy, lastModifiedDate, email, name, id) 
        values
            (?, ?, ?, ?, ?, ?, ?)

@MappedSuperclass를 사용했을 때 BaseEntity 테이블은 생성되지 않고 Member 테이블만 생성됩니다. 

그리고 Member 테이블 안에 BaseEntity 객체에 있던 속성이 같이 생성됩니다 

 

 

부모로부터 물려받은 매핑정보를 재정의 하려면 @AttributeOverride 나 @AttributeOverrides를 사용하고 

연관관계를 재정의하려면 @AssociationOverride@AssociationOverrides를 사용하면 됩니다.

 

사용 예시

 

[매핑정조 재정의]

@AttributeOverride(name = "id", column = @Column(name = "Member_name"))
public class Member extends BaseEntity{
	...
}
  • name = "id" : 부모 필드명
  • column =  @Column(name = "Member_name") : 재정의할 컬럼

 

여러 개의 컬럼을 재정의할 경우

@AssociationOverrides( {
	@AttributeOverride(name = "id",column = @Column(name="MEMBER_ID")),
	@AttributeOverride(name = "name",column = @Column(name="MEMBER_MEMBER"))
})
public class Member extends BaseEntity{
	...
}

 

[연관관계 재정의]

 

 

[BaseMember]

@MappedSuperclass
public class BaseMember extends BaseEntity{

	private String name;
	
	private String phoneNumber;
	
	private String passportNumber;
	
	@ManyToOne
	private BoardingRecord boardingRecords;
}

 

[AnonymousMember]

@Entity
@AssociationOverride(name="boardingRecords",joinColumns = @JoinColumn(name="AnonymousBoardingRecord"))
public class AnonymousMember extends BaseMember{
	
	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	
	
}
create table anonymous_member (
       id bigint not null,
        created_by varchar(255),
        created_date datetime,
        last_modified_by varchar(255),
        last_modified_date datetime,
        name varchar(255),
        passport_number varchar(255),
        phone_number varchar(255),
        anonymous_boarding_record bigint,
        primary key (id)
    ) engine=InnoDB

 

 

  • 외래키 이름 재정의
@AssociationOverride(name="boardingRecords",
	joinColumns = @JoinColumn(name="AnonymousBoardingRecord"),
    foreignKey = @ForeignKey(name="FK_TEST"))
public class AnonymousMember extends BaseMember{
	
	@Id @GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	
	
}
Hibernate: 
    
    alter table anonymous_member 
       add constraint FK_TEST 
       foreign key (anonymous_boarding_record) 
       references boarding_record (id)

 

'공부 > JPA' 카테고리의 다른 글

조인 테이블  (0) 2022.12.05
프록시와 지연 로딩  (0) 2022.12.01
연관관계 매핑 기초  (0) 2022.11.30
엔티티 매핑 - 기본키 매핑  (0) 2022.11.30
엔티티 매핑 - 필드와 컬럼 매핑  (0) 2022.11.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함