Whiteship's Note


Hibernate Core와 Java Persistence and EJB 3.0

Hibernate/Chapter 3 : 2008. 1. 20. 13:40


Hibernate Core Java Persistence and EJB 3.0
Persistence 클래스는 프록시 기반의 Lazy Loading을 사용할 때에만 아규먼트가 없는 public 또는 protected의 생성자를 필요로 한다. JPA는 모든 Entity 클래스들이 반드시 아규먼트가 없는 public 또는 protected의 생성자를 가지고 있어야만 한다.
Persistent 콜렉션은 반드시 인터페이스 타입이어야 하며, JDK가 제공하는 모든 인터페이스를 지원한다. 마찬가지로 모두 인터페이스 타입이어야 하며, 정렬된 콜렉션을 제외한 일부 인터페이스만 완전히 이식가능한 형태로 사용할 수 있다.
Persistent 속성들은 실행시에 accessor나 필드를 통해서 접근할 수 있으며, 혹은 완전히 다른 전략을 적용할 수도 있다. 마찬가지로 accessor나 필드를 통해서 접근가능하지만, 이식성이 필수라면 두 방법 모두 그렇치 않다.
XML 메타데이터 형식으로 모든 하이버네이트 맵핑 옵션을 사용할 수 있다. JPA 애노테이션은 기본적이고 가장 발전된 형태의 맵핑 옵션을 모두 제공한다. 하이버네이트 애노테이션은 별도의 맵핑과 튜닝을 필요로 한다.
XML 맵핑 메타데이터는 전역적으로 설정될 수 있으며 XML placeholder를 사용해서 메타데이터를 독립적으로 유지할 수 있다. 전역적인 메타데이터는 org.xml 메타데이터 파일에 두어야 이식성을 유지할 수 있다.

'Hibernate > Chapter 3' 카테고리의 다른 글

Hibernate Core와 Java Persistence and EJB 3.0  (0) 2008.01.20
XML 도메인 모델  (0) 2008.01.13
Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
top

Write a comment.


XML 도메인 모델

Hibernate/Chapter 3 : 2008. 1. 13. 12:40


특징

  • The XML data model is weak, its type system is complex and underpowered.
  • its data integrity is almost completely procedural.
  • it introduces hierarchical data structures that were outdated decades ago.
  • However, data in XML format is attractive to work with in Java; we have nice tools.

XML로 도메인 모델 뽑아내기

DOM4J로 도메인 모델 뽑아내기
Session dom4jSession = session.getSession(EntityMode.DOM4J);
Element userXML =
(Element) dom4jSession.load(User.class, storedUserId);
  • Element 클래스는 Dom4J API
화면에 출력하기
try {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter( System.out, format);
writer.write( userXML );
} catch (IOException ex) {
throw new RuntimeException(ex);
}

맵핑할 때 node 속성 사용하기

  • <class> 나 <property> 맵핑에서의 node 속성(node="name")은 XML 엘리먼트의 이름을 정의한다.
  • <property> 맵핑에서 node 속성(node="@name")은 XML 엘리먼트의 속성을 정의한다.
  • <property> 맵핑에서의 node 속성(node="name/@attname")은 name이라는 자식 엘리먼트에 attname이라는 속성을 정의한다.
  • 위의 속성을 사용해서 맵핑하면, 도메인 모델을 표현할 XML을 원하는 형태로 정의할 수 있다.

'Hibernate > Chapter 3' 카테고리의 다른 글

Hibernate Core와 Java Persistence and EJB 3.0  (0) 2008.01.20
XML 도메인 모델  (0) 2008.01.13
Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
top

Write a comment.


Map 도메인 모델

Hibernate/Chapter 3 : 2008. 1. 13. 12:05


특징

  • A dynamic domain model is a model that is dynamically typed.
<hibernate-mapping>
<class entity-name="ItemEntity" table="ITEM_ENTITY">
<id name="id" type="long" column="ITEM_ID">
<generator class="native" />
</id>
<property name="initialPrice" type="big_decimal"
column="INIT_PRICE" />
<property name="description" type="string" column="DESCRIPTION" />
<many-to-one name="seller" entity-name="UserEntity"
column="USER_ID" />
</class>
<class entity-name="UserEntity" table="USER_ENTITY">
<id name="id" type="long" column="USER_ID">
<generator class="native" />
</id>
<property name="username" type="string" column="USERNAME" />
<bag name="itemsForSale" inverse="true" cascade="all">
<key column="USER_ID" />
<one-to-many entity-name="ItemEntity" />
</bag>
</class>
</hibernate-mapping>
  • 다수의 도메인 맵핑을 하나의 파일 안에 두고 있다. 자바 클래스를 맵핑하는 것이 아니기 때문에 메타데이터를 어떻게 구성하던 맘대로 하라.
  • <class name="..."> 대신에 <class entity-name="..."> 를 사용했으며, 정적인 도메인 모델과 구분하기 위해 Entity를 접미어로 사용했다.
  • <many-to-one> 와 <one-to-many> 에서 entity-name에 설정한 이름을 사용했다.

동적인 맵 사용하기

동적인 맵 사용 예제
Map user = new HashMap();
user.put("username", "johndoe");

Map item1 = new HashMap();
item1.put("description", "An item for auction");
item1.put("initialPrice", new BigDecimal(99));
item1.put("seller", user);

Map item2 = new HashMap();
item2.put("description", "Another item for auction");
item2.put("initialPrice", new BigDecimal(123));
item2.put("seller", user);

Collection itemsForSale = new ArrayList();
itemsForSale.add(item1);
itemsForSale.add(item2);
user.put("itemsForSale", itemsForSale);

session.save("UserEntity", user);
  • Entity 하나 당 HashMap 객체 하나에 대응한다.
  • ArrayList는 bag을 맵핑하려고 사용했다.
  • Session.save(entity-name, HashMap)를 사용해서 저장했다.
  • cascading에 의해서 user와 user와 연관을 맺고 있는 두 개의 Item 역시 DB에 저장됐다.
  • Set을 사용하면 안 된다. Map은 equals()를 할 때 키값을 가지고 비교하기 때문에, Set을 사용하면 여러 개의 Entity를 넣을 수 없다.

정적인 엔티티 모드와 동적인 엔티티 모드 혼용하기

  • 맵핑할 때, <class name="model.UserPojo" entity-name="UserEntity" table="USER_ENTITY"> 이런식으로 클래스이름과 논리적인 이름을 모두 설정해 준다.
  • Session을 사용할 때는 entity-name을 사용해야 한다.
  • Session의 결과로 받는 값은 기본으로 POJO 객체다.
  • 둘 모두 <property name="default_entity_mode">dynamic-map</property> 를 사용해서 Map을 사용하도록 설정할 수 있다.
  • 특정 세션만 Map을 사용하도록 설정할 수 있다. Session dynamicSession = session.getSession(EntityMode.MAP);
  • Note that you can't link a map with a POJO instance. 당근이지.

하나의 클래스 여러번 맵핑하기

  • 맵핑 할 때 entity-name에 다른 값을 주면, 같은 클래스를 사용해서 서로 다른 테이블로 맵핑할 수 있다.
<hibernate-mapping>
<class name="model.Item" entity-name="ItemAuction"
table="ITEM_AUCTION">
<id name="id" column="ITEM_AUCTION_ID">...</id>
<property name="description" column="DESCRIPTION" />
<property name="initialPrice" column="INIT_PRICE" />
</class>
<class name="model.Item" entity-name="ItemSale" table="ITEM_SALE">
<id name="id" column="ITEM_SALE_ID">...</id>
<property name="description" column="DESCRIPTION" />
<property name="salesPrice" column="SALES_PRICE" />
</class>
</hibernate-mapping>

'Hibernate > Chapter 3' 카테고리의 다른 글

Hibernate Core와 Java Persistence and EJB 3.0  (0) 2008.01.20
XML 도메인 모델  (0) 2008.01.13
Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
top

Write a comment.


Entity 표현 대안

Hibernate/Chapter 3 : 2008. 1. 13. 11:59



  • 꼭 POJO로 Entity를 표현하지 않아도 된다.
  • 자바의 HashMap을 사용하여 Entity를 표현할 수 있다.
  • Dom4J를 사용하여 Entity를 표현할 수 있다.

Map 도메인 모델

XML 도메인 모델

'Hibernate > Chapter 3' 카테고리의 다른 글

Hibernate Core와 Java Persistence and EJB 3.0  (0) 2008.01.20
XML 도메인 모델  (0) 2008.01.13
Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
top

Write a comment.


Using placeholders

Hibernate/Chapter 3 : 2008. 1. 13. 11:57


특징

  • you can call any native SQL function or keyword your database system supports.
  • The disadvantage of putting native SQL in your mapping metadata is lost database portability.
  • One way to deal with this issue is to use a placeholder in your XML file that is replaced during build when the mapping files are copied to the target directory.

Placeholder

<id name="id" column="CATEGORY_ID" type="long">
<generator class="&idgenerator;"/>
</id>
  • &idgenerator; 값을 Entity placeholder라고 부른다. 이 값을 XML 파일의 상단에 문서 타입 정의의 일부분으로 선언할 수 있다.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
[
<!ENTITY idgenerator "auction.custom.MyOracleGenerator">
]>
  • 맵핑 파일을 읽어들일 때, XML 파서는 placeholder를 위에 선언한 값으로 대체한다.
  • 선언 부분을 별도의 DTD 파일로 한 단계 더 빼낼 수 있고, 원래 자리에는 dtd 파일을 참조하도록 global 옵션을 사용할 수 있다.
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
[
<!ENTITY % globals SYSTEM "classpath://persistence/globals.dtd">
%globals;
]>
  • 모든 전역적인 옵션을 DTD 파일로 빼낼 수 있다.
  • 다수의 속성이 여러 클래스에 중복되서 나타나지만, 상속을 사용할 수 없을 때는 XML 덩어리를 별도의 파일로 빼내서 다른 XMl 파일들에 포함 시킬 수도 있다.

'Hibernate > Chapter 3' 카테고리의 다른 글

Hibernate Core와 Java Persistence and EJB 3.0  (0) 2008.01.20
XML 도메인 모델  (0) 2008.01.13
Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
top

Write a comment.


Global annotation metadata

Hibernate/Chapter 3 : 2008. 1. 13. 11:56


Package Metadata

  • it's enabled with a file named package-info.java in a particular package directory
애노테이션 글로벌 설정
@org.hibernate.annotations.TypeDefs( {
@org.hibernate.annotations.TypeDef(name = "monetary_amount_usd", typeClass =
MonetaryAmountType.class, parameters = { @Parameter(name = "convertTo", value = "USD") }),
@org.hibernate.annotations.TypeDef(name = "monetary_amount_eur", typeClass =
MonetaryAmountType.class, parameters = { @Parameter(name = "convertTo", value = "EUR") }) })
@org.hibernate.annotations.NamedQueries( { @org.hibernate.annotations.NamedQuery(name =
"findItemsOrderByPrice", query = "select i from Item i order by i.initialPrice)") })
package auction.persistence.types;
  • declares two Hibernate type converters
  • 같은 방법으로 쿼리를 외부화 시키거나 전역 식별자 생성기를 정의할 수 있다.
  • JPA 애노테이션은 package-info.java 파일 안에서 사용할 수 없다.
  • If you need portable global Java Persistence metadata, put it in an orm.xml file.
  • Global annotations (Hibernate and JPA) can also be placed in the source code of a particular class, right after the import section.

모르는 것

  • package-info.java는 '-' 문자 때문에 에러나는데.. 흠;; 어쩌라는 거지?
  • Global 애노테이션을 아무곳에나 놓을 수 있다고? 그럼 package-info.java 파일은 뭐지;; 왜 거기에 넣으라고 한거지?

'Hibernate > Chapter 3' 카테고리의 다른 글

Hibernate Core와 Java Persistence and EJB 3.0  (0) 2008.01.20
XML 도메인 모델  (0) 2008.01.13
Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
top

Write a comment.


Global XML mapping metadata

Hibernate/Chapter 3 : 2008. 1. 13. 11:55


<hibernate-mapping>

<hibernate-mapping
schema="AUCTION"
default-lazy="false"
default-access="field"
auto-import="false">

<class ...>
...
</class>

</hibernate-mapping>
  • schema: 스키마 접두어로 사용한다. used by Hibernate for all SQL statements generated for the mapped classes.
  • default-lazy: 이 속성을 false로 하면, you enable default outer-join fetching for some class associations.
  • default-access: 이 속성의 값을 field로 하면, 하이버네이트가 이 파일 내부에 정의한 클래스의 필드에 바로 접근할 수 있다.
  • auto-import: 4장에서 다룸.

Tip

  • This default-lazy="true" switch has an interesting side effect: It switches to Hibernate 2.x default fetching behavior—useful if you migrate to Hibernate 3.x but don't want to update all fetching settings.

모르는 것

  • 스키마 접두어가 뭐지? Whiteship_Member, Whiteship_Group 뭐 이러식으로 테이블 이름이랑 컬럼 이름을 사용한다는 건가?
  • default outer-join fetching은 뭐지?

'Hibernate > Chapter 3' 카테고리의 다른 글

XML 도메인 모델  (0) 2008.01.13
Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
Accessor 메소드에 로직 추가하기  (0) 2008.01.09
top

Write a comment.


Handling global metadata

Hibernate/Chapter 3 : 2008. 1. 13. 11:53


전역적인 메타데이타
  • query strings can be externalized to metadata and called by a globally unique name in the application code.
  • a query usually isn't related to a particular class, and sometimes not even to a particular package.
  • Other application-scoped metadata includes user-defined mapping types (converters) and data filter (dynamic view) definitions.
Global XML mapping metadata

Global annotation metadata

Using placeholders

'Hibernate > Chapter 3' 카테고리의 다른 글

Map 도메인 모델  (0) 2008.01.13
Entity 표현 대안  (0) 2008.01.13
Using placeholders  (0) 2008.01.13
Global annotation metadata  (0) 2008.01.13
Global XML mapping metadata  (0) 2008.01.13
Handling global metadata  (0) 2008.01.13
XDoclet 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
애노테이션 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
XML 사용하기 - 하이버네이트 맵핑  (0) 2008.01.11
Accessor 메소드에 로직 추가하기  (0) 2008.01.09
POJO 관계 구현하기  (0) 2008.01.09
top

Write a comment.


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

Hibernate/Chapter 3 : 2008. 1. 11. 11:47


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는 최소한 자동 완성을 제공 해준다.
top

Write a comment.


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

Hibernate/Chapter 3 : 2008. 1. 11. 11:46


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

Write a comment.


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

Hibernate/Chapter 3 : 2008. 1. 11. 11:46


단점

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

Write a comment.


Accessor 메소드에 로직 추가하기

Hibernate/Chapter 3 : 2008. 1. 9. 16:43


Setter 메소드에 Validation 로직 추가.

  • 하이버네이트가 DB에서 데이터를 가져올 때 이 Setter 메소드를 사용하여 속성을 설정하는데, 그럴 경우에는 validation을 하지 않고 변수에 직접 접근하도록 설정할 수 있다. 어떻게? p122 첫 줄.

Getter 메소드에서 복사체 전달.

  • 하이버네이트는 Dirty Checking을 하기 때문에, Persistent 상태의 객체 속성의 변경을 DB에 반영하기 위해 UPDATE문을 자동으로 실행한다.
  • Getter에서 같은 값의 다른 객체를 반환하더라도 불필요한 Update문을 실행하지 않는다.
다른 객체 반환하는 Getter
public String getFirstname() {
return new String(firstname);
}
  • Hibernate compares the objects by value—not by object identity—to determine whether the property's persistent state needs to be updated.
  • 하지만 Collection일 경우에는 예외이며, 이 경우 같은 객체들을 가진 다른 Collection 객체를 반환하면, 불필요한 UPDATE 문을 실행한다.
다음과 같이 하지 말 것
public void setNames(List namesList) {
names = (String[]) namesList.toArray();
}
public List getNames() {
return Arrays.asList(names);
}

예외 던지기

  • Runtime Exception이 발생하면, 트랜잭션을 롤백하고 Checked Exception이 발생하면, 하이버네이트가 잡아서 Runtime Exception으로 랩핑한다.
참조 : Java Persistence With Hibernate
top

Write a comment.


POJO 관계 구현하기

Hibernate/Chapter 3 : 2008. 1. 9. 16:43


Scaffolding code

  • 연관을 맺기 위해 필요한 필드와 메소드.

1:다 관계

  • 다수를 가질 경우, Hibernate requires interfaces for collection-typed attributes
  • 양방향일 경우, 해당 타입의 속성이 필요함.
  • 연결하기: 두 가지 행위가 필요함.
  • Hibernate doesn't manage persistent associations. If you want to manipulate an association, you must write exactly the same code you would write without Hibernate.
  • Convenient Method 도입하기:
1:다 관계
public void addChildCategory(Category childCategory) {
if (childCategory == null)
throw new IllegalArgumentException("Null child category!");
if (childCategory.getParentCategory() != null)
childCategory.getParentCategory().getChildCategories().remove(childCategory);
childCategory.setParentCategory(this);
childCategories.add(childCategory);
}
    • reduces the lines of code
    • enforces the cardinality of the association

다:다 관계

  • both sides are implemented with collection-valued attributes.
  • Convenient Method
다:다 관계
public void addCategory(Category category) {
if (category == null)
throw new IllegalArgumentException("Null category");
category.getItems().add(this);
categories.add(category);
}
  • You can also add logic to your accessor methods.

참조 : Java Persistence With Hibernate
top

Write a comment.


하이버네이트와 POJO

Hibernate/Chapter 3 : 2008. 1. 9. 16:41


하이버네이트는 Pesistent 클래스가 Serializable 인터페이스를 구현하도록 강요하지 않지만, 객체가 HttpSession에 저장되어야 하거나 RMI를 사용하여 전송할 것이라면 구현해야한다.

JavaBeans 스펙은 특정 생성자를 필요로 하지 않지만, 하이버네이트(와 JPA)에서 모든 Persistent Class들은 인자가 없는 기본 생성자를 필요로 한다.

생성자는 public이 아니여도 괜찮지만, 만약에 프록시를 사용할 거라면, 최소한 package-visivle(public, protected, default 접근 지시자 사용 가능)해야한다.

프록시를 생성할 때는 클래스가 final이여서도 안되고 final 메소드를 가지고 있어도 안 된다!

Persistent Class 객체들의 상태를 어떻게 하이버네이트가 영속화할지는 필드에 직접 접근하거나 게터, 세터 메소드를 사용하는 방법 중에 선택할 수 있다.

참조 : Java Persistence With Hibernate
top

Write a comment.


Transparent and automated persistence

Hibernate/Chapter 3 : 2008. 1. 9. 16:31


Transparent

  • 도메인 모델의 영속성 클래스와 영속성 로직의 완전한 분리. transparent to mean a complete separation of concerns between the persistent classes of the domain model and the persistence logic, where the persistent classes are unaware of—and have no dependency on—the persistence mechanism.
  • Transparent persistence improves code readability and maintenance, as you'll soon see.
  • Testability is a basic requirement for applications with rich domain models
  • Transparent persistence fosters a degree of portability

Automatic

  • 자주 사용하는 SQL과 JDBC API사용으로부터 사용자를 해방시켜준다는 것을 의미한다.

하이버네이트의 투명성

  • 도메인 클래스가 별도의 인터페이스를 구현하거나 상위 클래스를 상속 받지 않아도 된다.
  • 도메인 클래스를 영속성 문맥 밖에서도 사용 할 수 있다.
  • objects aren't aware of the underlying data store.
참조 : Java Persistence With Hibernate
top

TAG hibernate

Write a comment.


관심사 분리Seperation Of Concern

Hibernate/Chapter 3 : 2008. 1. 9. 16:30


도메인에서 분리되어야 하는 이유

  • The domain model implementation is usually a central, organizing component; it's reused heavily whenever you implement new application functionality. For this reason, you should be prepared to go to some lengths to ensure that concerns other than business aspects don't leak into the domain model implementation.

관심사 누수leakage of concern

  • You shouldn't put code that addresses these crosscutting concerns in the classes that implement the domain model. When these concerns start to appear in the domain model classes, this is an example of leakage of concerns.
  • EJB 컨테이너가 interseption을 사용해서 몇몇 leakage of concern을 해결했지만, EJB 2.1에서 도메인에 많은 규칙과 제약을 부과하는 바람에 관심사 누수가 생겼다. 이 경우에는 컨테이너 구현 관심사가 누수 됐다. EJB 3.0은 이것을 반영해서 다시 비침략적nonintrusive이고 훨씬 전통적인 JavaBean 프로그래밍 모델에 가까워졌다.

하이버네이트의 관심사

  • Hibernate is a solution for just one of these concerns: persistence.
  • Hibernate persistent classes and the EJB 3.0 entity programming model offer transparent persistence. Hibernate and Java Persistence also provide automatic persistence.
참조 : Java Persistence With Hibernate
top

TAG hibernate

Write a comment.