2010-04-05 4 views
26

this tutorial에서 JPA를 배우고 있습니다.Java - JPA @Basic 및 @Embedded 주석

나는 다음과 같은 주석을 이해하는데 약간의 혼란이 있습니다 @Embedded 주석처럼 지속에 매립형 기본의

  • @Basic
  • @Embedded

필드.

임베드 유형의 기본 분야는 지속에, 왜 우리가 @Embedded 주석 @Embeddable 주석이 그 인스턴스 소유 기업의 본질적인 부분으로 저장됩니다 클래스를 지정할 수 있습니다

답변

43

을해야합니다. 이 주석은 속성 없음입니다.

@Embeddable 
public class EmploymentPeriod { 
    java.util.Date startDate; 
    java.util.Date endDate; 
    ... 
} 

@Embedded 주석 값 임베디드 클래스의 인스턴스 인 엔티티의 지속 필드 또는 속성을 지정하기 위해 사용된다. 기본적으로 @Embeddable 클래스에 지정된 열 정의는 소유 엔티티의 테이블에 적용하지만 당신은 @AttributeOverride를 사용하여 그들에게을 무시할 수 : 옵션 @Basic 주석에 대해서는

@Embedded 
@AttributeOverrides({ 
    @AttributeOverride(name="startDate", [email protected](name="EMP_START")), 
    @AttributeOverride(name="endDate", [email protected](name="EMP_END")) 
}) 
public EmploymentPeriod getEmploymentPeriod() { ... } 

, 당신은 구성하는 데 사용할 수 있습니다 가져 오기 유형을 LAZY으로 설정하고 optional 속성을 사용하여 (기본이 아닌 유형의 경우) Null 값을 금지하도록 매핑을 구성합니다.

@Basic(fetch=LAZY) 
protected String getName() { return name; } 

필드 또는 속성에 명시 적으로 표시하여 영구적으로 표시 할 수도 있습니다 (문서 목적으로).

+3

Q1. 만약 embeddable 타입의 필드 나 프로퍼티가 영속적으로 지속된다면'@ Embedded' 주석을 추가해야하는 이유는 무엇입니까? Q2. @ @ Embedded' 주석없이'@ AttributeOverrides' 어노테이션을 사용할 수 있습니까? '@ Basic'에 대해서도 약간의 빛을 던져 주시겠습니까? –

+2

Q1. @Embedded는 열 정의 Q2를 재정의 할 수 있기 때문에. 아니, 그렇게 생각하지 않아. 이에 대한 좋은 예가 여기에 나와 있습니다. http://www.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5.0.0/html/Hibernate_Annotations_Reference_Guide/ch02s02s02s03.html –

+2

@Pascal 재정의가 없으면 어떻게해야합니까? '@ Embedded'의 목적은 무엇입니까? 빠져 나갈 수 있습니까? –

11

ORM 매핑에서 개체 모델의 세분성은 데이터베이스보다 세밀해질 수 있습니다.

예를 들어 데이터베이스에 Person 레코드가있을 수 있습니다.이 레코드는 모델에서 Address 개체에 대한 참조를 포함하도록 추가로 분해 될 수 있습니다. 그것이 @Embedded@Embeddable 주석이 들어있는 곳입니다. 간단히 Entity을 다른 주석의 일부로 저장할 수있는 관계를 말합니다.

@Basic 어노테이션은 int와 float와 같은 기본 유형과 해당 래퍼와 열거 형에 기본적으로 적용되는 가장 간단한 매핑 형식입니다.자세한 내용은 여기가있을 수 있습니다 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-property

2

@Basic 베이직 주석은 다음과 같은 유형의 불변의 속성 또는 예를 변수에 적용 할 수

:

자바 원시적에게 types, 기본 유형의 랩퍼, String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java .sql.Tim byte [], Byte [], char [], Character [], enums 및 java.io.Serializable을 구현하는 기타 모든 유형이 있습니다.

영구 필드 및 이러한 유형의 속성에 대해서는 기본 주석을 사용하는 것이 선택 사항입니다. 해당 필드 또는 속성에 기본 주석을 지정하지 않은 경우 기본 주석의 기본값 인 이 적용됩니다.

@Basic 
protected String name; 

@Embedded

@Basic(fetch=LAZY) 
protected String getName() { 
    return name; 
} 

지속적 필드 또는 홍보를 지정합니다 : 예

값이 인 엔티티의 오퍼티팅 (embeddable class) 인스턴스. 삽입 가능한 클래스는 삽입 가능으로 주석 된 이어야합니다.

예 1

@Embedded  
@AttributeOverrides({ 
     @AttributeOverride(name="startDate", [email protected]("EMP_START")), 
     @AttributeOverride(name="endDate", [email protected]("EMP_END"))  
})   
public EmploymentPeriod getEmploymentPeriod() { ... } 

예 2

@Entity 
public class Project { 
    @EmbeddedId ProjectId id; 
    //other fields 
} 


@Embeddable 
Class ProjectId { 
    int departmentId; 
    long projectId; 
} 

JSR Persistence SpecificationSource reference