애노테이션 사용하기 - 하이버네이트 맵핑
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"
) 무슨 뜻일까?