MappedSuperclass
Entity의 공통된 속성 필드를 묶어서 별도의 클래스를 만들 때 썻다.
package를 보면
package javax.persistence;
영속성을 위해 도입된 인터페이스를 보인다.
아래와 같이 정의된 부분을 해석해보자면 MappedSuperclass 인터페이스를 구현한 클래스는 그 자체로 별도의 테이블을 갖지 않는다. 그러나 이 MappedSuperclass 어노테이션으로 지정된 클래스는 상속을 통해서 엔티티에서 지정한 속성과 같이 매핑이 된다. 즉 공통된 부분을 별도의 클래스로 정의한 후 MappedSuperclass 어노테이션으로 지정해준 뒤 entity에서 해당 클래스를 상속을 받게 된다면 굳이 entity에서 매핑해주지 않아도(속성으로 선언해주지 않아도) 알아서 테이블과 관련된 속성으로 객체에 매핑해주게 된다.
MappedSuperclass로 지정된 클래스를 상속 받았다고 해도 AttributeOverride,AssociationOverride등의 어노테이션이나 해당 XML 요소를 통해 재정의도 가능하다.
/*
* Copyright (c) 2008, 2019 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
*
http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
*
http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Linda DeMichiel - 2.1
// Linda DeMichiel - 2.0
package javax.persistence;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* Designates a class whose mapping information is applied
* to the entities that inherit from it. A mapped superclass
* has no separate table defined for it.
*
* <p> A class designated with the <code>MappedSuperclass</code>
* annotation can be mapped in the same way as an entity except that the
* mappings will apply only to its subclasses since no table
* exists for the mapped superclass itself. When applied to the
* subclasses the inherited mappings will apply in the context
* of the subclass tables. Mapping information may be overridden
* in such subclasses by using the <code>AttributeOverride</code> and
* <code>AssociationOverride</code> annotations or corresponding XML elements.
*
* <pre>
* Example: Concrete class as a mapped superclass
*
* @MappedSuperclass
* public class Employee {
*
* @Id protected Integer empId;
* @Version protected Integer version;
* @ManyToOne @JoinColumn(name="ADDR")
* protected Address address;
*
* public Integer getEmpId() { ... }
* public void setEmpId(Integer id) { ... }
* public Address getAddress() { ... }
* public void setAddress(Address addr) { ... }
* }
*
* // Default table is FTEMPLOYEE table
* @Entity
* public class FTEmployee extends Employee {
*
* // Inherited empId field mapped to FTEMPLOYEE.EMPID
* // Inherited version field mapped to FTEMPLOYEE.VERSION
* // Inherited address field mapped to FTEMPLOYEE.ADDR fk
*
* // Defaults to FTEMPLOYEE.SALARY
* protected Integer salary;
*
* public FTEmployee() {}
*
* public Integer getSalary() { ... }
*
* public void setSalary(Integer salary) { ... }
* }
*
* @Entity @Table(name="PT_EMP")
* @AssociationOverride(
* name="address",
* joincolumns=@JoinColumn(name="ADDR_ID"))
* public class PartTimeEmployee extends Employee {
*
* // Inherited empId field mapped to PT_EMP.EMPID
* // Inherited version field mapped to PT_EMP.VERSION
* // address field mapping overridden to PT_EMP.ADDR_ID fk
* @Column(name="WAGE")
* protected Float hourlyWage;
*
* public PartTimeEmployee() {}
*
* public Float getHourlyWage() { ... }
* public void setHourlyWage(Float wage) { ... }
* }
* </pre>
*
* @see AttributeOverride
* @see AssociationOverride
* @since 1.0
*/
@Documented
@Target({TYPE})
@Retention(RUNTIME)
public @interface MappedSuperclass {
}
728x90
'프로그래밍 > java' 카테고리의 다른 글
[spring] spring AOP (0) | 2023.01.19 |
---|---|
[spring] spring data rest (0) | 2022.10.25 |
[spring] CommunicationsException-Communications link failure (0) | 2022.10.25 |
java와 메모리 (0) | 2022.10.07 |
java의 동시성문제 (0) | 2022.10.05 |