Annotation

  • JDK 5.0에 추가된 기능으로 JDK 1.4이하에서는 XDoclet 이라는 주석에 사용하는 애노테이션을 사용했었다.
  • type-safe and declared interfaces for the definition of annotations.
  • Autocompletion and compile-time checking are no longer an issue.
  • it has better defaults

Annotation 만들기

Entity 애노테이션 정의
package javax.persistence;

@Target(TYPE)
@Retention(RUNTIME)
public @interface Entity {
String name() default "";
}
  • @Target(TYPE)은 메타데이터의 메타데이터로, Entity 애노테이션이 Type위에만 붙일 수 있다는 것을 설정.
  • @Retention(RUNTIME)은 Entity 애노테이션을 하이버네이트가 런타임에도 읽을 수 있도록 보유 정책 설정.
  • 속성과 기본 값 설정할 수 있음.

Annotation 사용하기

Entity 애노테이션 사용
package auction.model;

import javax.persistence.*;

@Entity
@Table(name = "ITEM")
public class Item {
...
}
  • 애노테이션을 사용하면 소스를 수정할 때 같이 리팩터링 할 수 있기 때문에 좋다.

Utilizing vendor extensions

  • fetching and caching settings, are only available as Hibernate-specific annotations.
하이버네이트의 애노테이션 사용하기
package auction.model;

import javax.persistence.*;

@Entity
@Table(name = "ITEM")
@org.hibernate.annotations.BatchSize(size = 10)
@org.hibernate.annotations.DiscriminatorFormula(
"case when ITEM_IS_SPECIAL is not null then A else B end"
)
public class Item {
...
}
  • @BatchSize는 패칭 옵션.
  • @DiscriminatorFormula is especially useful for legacy
    schemas when class inheritance can't be determined with simple literal
    values.
  • JPA 표준 애노테이션이 아닌 특정 밴더가 제공하는 애노테이션 앞에는 전체 패키지 이름을 써주는 것이 좋다. 그래야 나중에 밴더가 바뀌더라도 해당 부분만 바꾸기 쉽기 때문이다.
  • 이 애노테이션들은 특정 클래스에 종속적인데, 간혹 다수의 클래스에 적용하고 싶은 메타데이터가 있을 수도 있다.

JPA XML descriptor

  • XML deployment descriptors in certain situations, especially for configuration metadata that changes with each deployment.
  • every annotation in EJB 3.0 and JPA can be replaced with an XML descriptor element
XML descriptor
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
version="1.0">
<persistence-unit-metadata>
<xml-mapping-metadata-complete />
<persistence-unit-defaults>
<schema>MY_SCHEMA</schema>
<catalog>MY_CATALOG</catalog>
<cascade-persist />
</persistence-unit-defaults>
</persistence-unit-metadata>
<package>auction.model</package>
<entity class="Item" access="PROPERTY" metadata-complete="true">
<attributes>
<id name="id">
<generated-value strategy="AUTO" />
</id>
</attributes>
</entity>
</entity-mappings>
  • This XML is automatically picked up by the JPA provider if
    you place it in a file called orm.xml in your classpath, in the
    META-INF directory of the persistence unit.
  • 애노테이션 설정을 완전히 무시할 수도 있고, 오버라이딩 하게 할 수도 있다.
  • 하이버네이트 XML 맵핑 파일과 호환되지 않는다.
  • 하이버네이트 XML 맵핑을 사용하면 JPA XML Descriptor보다 더 다양한 맵핑 정보를 표현할 수 있다.
  • 하지만 하이버네이트 XML 맵핑으로 애노테이션을 오버라이딩 할 수는 없다.

모르는 것

  • 애노테이션이 Type-safe 하다는 것이 무슨 뜻일까?
  • @org.hibernate.annotations.BatchSize(size = 10) 무슨 뜻일까?
  • @org.hibernate.annotations.DiscriminatorFormula(
    "case when ITEM_IS_SPECIAL is not null then A else B end"
    ) 무슨 뜻일까?