XDoclet 사용하기 – 하이버네이트 맵핑

XDoclet

  • XDoclet leverages the Javadoc tag format (@attribute) to specify class-, field-, or method-level metadata attributes.
  • XDoclet is implemented as an Ant task that generates
    Hibernate XML metadata (or something else, depending on the plug-in) as
    part of the build process.

하이버네이트 XML 생성

XDoclet 사용
/**
* The Category class of the CaveatEmptor auction site domain model.
*
* @hibernate.class table="CATEGORY"
*/
public class Category {
...
/**
* @hibernate.id generator-class="native" column="CATEGORY_ID"
*/
public Long getId() {
return id;
}
...
/**
* @hibernate.property
*/
public String getName() {
return name;
}
...
}

단점

  • 별도의 Ant 태스크 필요해.
  • 배포 할 때마 설정을 좀 바꿔야 할 수도 있어.
  • 개발 환경에서 XDoclet Validation을 수행할 수 없지만, 최근 IDE는 최소한 자동 완성을 제공 해준다.

애노테이션 사용하기 – 하이버네이트 맵핑

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”
    ) 무슨 뜻일까?

XML 사용하기 – 하이버네이트 맵핑

단점

  • Metadata is not, by nature, more flexible or maintainable than plain Java code.
  • Many existing metadata formats weren’t designed to be
    readable and easy to edit by hand. 적절한 기본값을 제공해주지 않아서 필요 이상의 타이핑이 필요하다.
    속성없이 엘리먼트만 사용하는 경우도 있다.
  • Good XML editors, especially in IDEs, aren’t as common as
    good Java coding environments. DTD가 제공되지 않아서 자동완성과 검증 기능을 사용하지 못하는 경우가
    있다.

하이버네이트의 XML

  • 위의 모든 단점을 고려했다.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<class name="auction.model.Category" table="CATEGORY">
<id name="id" column="CATEGORY_ID" type="long">
<generator class="native"/>
</id>
<property name="name" column="NAME" type="string"/>
</class>

</hibernate-mapping>
  • 여러 클래스 맵핑 정보를 하나의 파일 안에 모두 두는 것도 가능하지만 클래스 당 매핑 파일 하나를 권장한다.
  • 맵핑 파일은 클래스와 같은 패키지에 놓는것을 권장한다.