Whiteship's Note


기본 속성 맵핑하기- 실습

Hibernate/Chapter 4 : 2008. 1. 22. 09:41


기본값 설정하는 방법을 테스트합니다.
- @Column의 columnDefinition 속성을 사용해서 column을 만들 때 사용할 공식을 사용할 수 있습니다.
- 하이버의 @GenerationTime 애노테이션을 사용해서 기본값이나 생성되는 값을 언제 생성할 지 설정할 수 있습니다.

1. 테스트 코드

    @Test
    public void add() throws Exception {
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();

        Member member = new Member();
        member.setName("썬");

        session.save(member);
        session.flush();

        transaction.rollback();
        session.close();
        assertNotNull(member.getId());
        assertEquals(new Integer(1), member.getDefaultNum());
    }

2. 결과 쿼리

Hibernate: select hibernate_sequence.nextval from dual
Hibernate: insert into Member (name, id) values (?, ?)
Hibernate: select member_.defaultNum as defaultNum0_ from Member member_ where member_.id=?

3. Persistent Class

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @Column(columnDefinition = "number(10,2) default '1'")
    @org.hibernate.annotations.Generated(org.hibernate.annotations.GenerationTime.INSERT)
    private Integer defaultNum;

    ...

}

위 테스트 코드에서 flush를 하지 않으면 시퀀스만 가져오고 insertion은 이뤄지지 않습니다. insertion을 안하기 때문에 db가 생성하는 기본값을 가져오기 위해 발생하는 세번째 쿼리도 실행하지 않습니다. 따라서 다음의 SQL 한 문장만 실행합니다.

Hibernate: select hibernate_sequence.nextval from dual

참조 : 4.4.1 Mapping basic properties/Generated and default property values




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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

  1. Favicon of http://http://gall.dcinside.com/list.php?id=programming BlogIcon 맵돌이2.3 2008.01.22 22:07 PERM. MOD/DEL REPLY

    columnDefinition = "number(10,2) default '1'"
    어제 기본값 매핑이 잘 안된다고 했었는데 조금전에 원인을 알아냈습니다. 위 구문은 Hibernate나 Java Persistence에서 처리되지 않고 DB로 막바로 입력되는데요(Create시점에), 숫자에 number를 사용하는건 Oracle에서더군요. MSSQL, MySQL, HSQLDB등에서는 numeric을 사용하기 때문에 제가 저 구문을 그대로 사용해도 HSQLDB에서는 오류가 났던 것이었습니다.
    조금 상세하게 오류를 설명하자면, 저 구문은 지원되지 않기 때문에 테이블이 생성되지 않은 채 CRUD를 실행하려 하기 때문에 기본 insert에서 '넣을 수 없다'라고 오류가 뜨더군요. 생성이 되지 않을 때 경고조차 발생시키지 않는 점은 아쉽다고 할 수 있겠습니다.

    즐거운 hibernate공부하세요~

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.01.22 23:19 PERM MOD/DEL

    네 맞습니다. 저 columnDefinition에 설정한 값은 하이버가 테이블 만들 때 그래로 사용합니다. 따라서, 밑단에서 사용하는 DBMS 문법을 따라줘야 합니다.

    방문 감사합니다~

Write a comment.


Hibernate VS JPA

Hibernate/Chapter 4 : 2008. 1. 20. 13:41


Hibetnate JPA
Entity와 Value-type 개념은 rich and fine-grained domain model을 지원하기 위한 필수 요소다. Value-type을 embeddable classes 라고 부른다. nonportable.
10가지나 되는 식별자 생성기 제공한다. 4가지만 지원한다. 벤더가 확장할 수 있도록 지원한다.
필드, Accessor 메소드, PropertyAccessor 인터페이스 구현체를 통해서 접근 가능하다. 혼용할 수 있다. 속성이나, Accessor 메소드로 접근할 수 있는데, 하이버네이트 애노테이션 없이 혼용할 수는 없다.
formula와 DB가 생성한 값을 사용할 수 있다. JPA에는 이런 거 없다. 하이버가 필요하다.

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

  1. Favicon of https://jjaeko.tistory.com BlogIcon 째코 2008.01.20 14:08 신고 PERM. MOD/DEL REPLY

    제목이 r하고 n이 합쳐져서 하이버메이트로 보이네요 ~.~

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2008.01.20 22:29 PERM MOD/DEL

    ㅋㅋ하이버를 친구삼아 열공해야겠네요.

Write a comment.


컴포넌트 맵핑하기

Hibernate/Chapter 4 : 2008. 1. 20. 13:38


특징

  • 자바 객체에서 Value-type과 Entity를 구분지을 수 있는것은 식별자 속성 뿐이다.
  • 컴포넌트와 Entity 간의 양방향 관계를 설정할 수 있다.
  • 컴포넌트가 다른 컴포넌트나 Entity를 가지고 있을 수 있다.
    • This flexibility is the foundation of Hibernate's support for finegrained object models.

설정하기

  • 컴포넌트에는 @Embeddable Entity의 속성에는 @Embedded 사용하기
  • @org.hibernate.annotations.Parent 애노테이션으로 컴포넌트에서 back-pointer 프로퍼티 사용 가능.
  • if you store a component object with all null property values, Hibernate returns a null component when the owning entity object is retrieved from the database.
컴포넌트 사용하기
@Entity
@Table(name = "USERS")
public class User {
@Embedded
private Address homeAddress;


}
컴포넌트 클래스 정의하기
@Embeddable
public class Address {

@Column(name="ADDRESS_STREET", nullable=false)
private String street;

@Column(name="ADDRESS_ZIPCODE", nullable=false)
private String zipcode;

@Column(name="ADDRESS_CITY", nullable=false)
private String city;

}
  • 컴포넌트를 사용하는 쪽에서 컴포넌트의 컬럼 정의를 재정의 할 수도 있다.
  • 단점
    • First,shared references, as for all value types, aren't possible. -> 이건 value-type 이니까 당연히 그래야 하는거 아닌가.
    • Second, there is no elegant way to represent a null reference to an Address. -> 흠.. new Address()를 항상 가지고 있어야겠군.

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.


기본 속성 맵핑하기

Hibernate/Chapter 4 : 2008. 1. 20. 13:35


특징

  • @Transient 애노테이션을 붙이거나 자바의 transient 키워드를 사용하지 않으면 기본으로 전부 Persistent 대상으로 인식한다.
  • 애노테이션을 붙이지 않으면 다음과 같은 규칙이 적용된다.
    • JDK가 제공하는 타입일 경우에 자동으로 Persistent 대상이 된다.
    • 그렇지 않고, 속성의 타입에 해당하는 클래스에 @Embeddable 애노테이션이 붙어있는 경우, 컴포넌트를 가지고 있는 형태로 맵핑된다.
    • 그렇지도 않고, 속성의 타입이 Serializable 인터페이스를 구현한 경우, 직렬화된 형태로 DB에 저장된다. (이러길 원치 않을 것이다.)

설정하기

  • Chapter 17에서 하이버네이트 애노테이션으로 DDL을 작성하거나 동적으로 검증하는 기능에 대해 다룬다.
  • 클래스 속성에 접근하는 방법은 @Id 애노테이션이 붙어있는 위치가 기본 방법으로 설정 된다.(JPA)
  • 하이버네이트는 이 기본 방법을 변경할 수 있는 기능을 제공한다. @org.hibernate.annotations.AccessType(<strategy>)
    • 클래스에 AccessType 애노테이션을 사용하면, @Id로 인해 설정되는 접근 전략을 무시하며, 해당 클래스의 필드나 메서드에 붙어있는 모든 애노테이션들은 AccessType에서 정의한 접근 전략을 따른다.
    • 기본 상태이거나 필드 접근인 상태에서 @AccessType("property")를 필드 위에 붙여주면, 해당 속성을 accessor 메소드들을 이용해서 접근한다.
    • 기본 상태이거나 Accessor 접근이 상태에서 @AccessType("field")를 getter 위에 붙여주면, 해당 속성은 필드에 바로 접근한다.
    • @Embedded 클래스는 자신을 가지고 있는 쪽 클래스의 접근 방법을 따른다.
    • @MappedSuperclass 클래스는 맵핑 된 클래스의 접근 방법을 따른다.
  • noop 방식: "virtual" property in HQL queries. to use the database column in HQL queries only.
  • 마음에 드는게 없으면 org.hibernate.property.PropertyAccessor 인터페이스 구현해서 직접 만들어 됨.
    • 사용할 때는 @AccessType 애노테이션의 access 속성에 패키지 이름을 붙인 클래스 이름을 써주면 돼.

계산이 필요한 속성

  • 맵핑되는 컬럼은 없다.
  • @Fomula 애노테이션 사용하기
필드에서 계산된 속성 사용하기
@org.hibernate.annotations.Formula("TOTAL + TAX_RATE * TOTAL")
public BigDecimal getTotalIncludingTax() {
return totalIncludingTax;
}
  • SQL 함수도 사용할 수 있다.

h1, DB에서 생성된 값과 기본 값

  • public 세터를 만들지 말아라.
  • @Generated 애노테이션 사용하기
DB에서 생성된 값 사용하기
@Column(updatable = false, insertable = false)
@org.hibernate.annotations.Generated(
org.hibernate.annotations.GenerationTime.ALWAYS
)
private Date lastModified;
  • 기본값이 설정되도록 하려면 flush 해야한다.
  • columnDefinition 속성으로 기본값 설정하기
기본값 설정하기
@Column(name = "INITIAL_PRICE",
columnDefinition = "number(10,2) default '1'")
@org.hibernate.annotations.Generated(
org.hibernate.annotations.GenerationTime.INSERT
)
private BigDecimal initalPrice;
  • columnDefinition: complete properties for the column DDL, with datatype and all constraints.
    • DDL customization은 8장에서 다룬다.

모르는 것

  • @MappedSuperclass는 뭔가?

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

  1. Favicon of http://http://gall.dcinside.com/list.php?id=programming BlogIcon 맵돌이2.3 2008.01.21 23:12 PERM. MOD/DEL REPLY

    '기본값 설정하기'부분을 실제 코드에서 돌려보셨는지요? 제가 getter위에 동일한 설정을 넣고 돌렸더니 맨 처음 persist구문에서 org.hibernate.exception.SQLGrammarException이 뜨더군요. columnDefinition과 Generated를 모두 삭제하지 않는 한 계속해서 발생했었습니다.
    책의 극히 사소한 부분이긴 하지만 HbmXML로 generated설정하는 부분도 마찬가지로 예상대로 작동하지 않고 신기하게 작동하더군요.

    한 번 코드를 테스트해봐주세요.
    사용환경 : Hibernate-3.2, hibernate-annotations-3.3.0GA, hibernate-entitymanager-3.3.1GA.

    개인적으로 블로그를 운영하지 않기 때문에 주 서식지인 DC프로그래밍갤을 달아두었습니다. 죄송합니다.

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2008.01.21 23:20 신고 PERM MOD/DEL

    오호 DC에 프로그래밍겔도 있었군요. 저도 아직 위의 내용은 책 읽으면서 정리만 해두고 테스트를 안해봤습니다.

    어차피 모두 테스트 해보려고 했는데, 내일 오전 중으로 확인해보고 블로그에 올리겠습니다.

Write a comment.


작명 지침 사용하기

Hibernate/Chapter 4 : 2008. 1. 20. 13:29


특징

  • Hibernate provides a feature that allows you to enforce naming standards automatically.

설정하기

  • NamingStrategy 인터페이스 구현하기
  • ImprovedNamingStrategy 클래스 상속받아서 구현하기
네임스페이스 등록하기
import org.hibernate.cfg.ImprovedNamingStrategy;
import org.hibernate.util.StringHelper;

public class CENamingStrategy extends ImprovedNamingStrategy {
public String classToTableName(String className) {
return StringHelper.unqualify(className);
}

public String propertyToColumnName(String propertyName) {
return propertyName;
}

public String tableName(String tableName) {
return "CE_" + tableName;
}

public String columnName(String columnName) {
return columnName;
}

public String propertyToTableName(String className, String propertyName) {
return "CE_" + classToTableName(className) + '_'
+ propertyToColumnName(propertyName);
}
}
  • classToTableName(): <class> 맵핑에서 table 속성에 값을 입력하지 않았을 때 호출.
  • propertyToColumnName(): 명시적인 column 이름을 설정하지 않았을 때 호출.
  • tableName(), columnName(): 명시적으로 이름을 설정했을 때 호출.
  • 동적으로 설정을 바꿀 수 있음.
동적으로 네임스페이스 바꾸기
Configuration cfg = new Configuration();
cfg.setNamingStrategy( new CENamingStrategy() );
SessionFactory sessionFactory sf =
cfg.configure().buildSessionFactory();

모르는 것

  • SessionFactory 설정할 때 구현한 클래스를 등록해 주면 되는건가?

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.


SQL문에 따옴표 사용하기

Hibernate/Chapter 4 : 2008. 1. 20. 13:27


특징

  • Hibernate doesn't quote table and column names in the generated SQL.
  • 대소문자를 구분하거나, 특수 문자를 사용하는 기존 DB의 경우 하이버네이트가 자동으로 생성하는 컬럼이나 테이블이름을 인식하지 못할 수도 있다.

설정하기

역따옴표 사용하기
<property name="description"
column="`DESCRIPTION`"/>
  • If you quote a table or column name with backticks in the mapping document, Hibernate always quotes this identifier in the generated SQL.
  • 애노테이션에서도 설정할 수 있으나, 하이버네이트 @Column 애노테이션을 사용하야 한다. JPA에서는 지원하지 않는다.

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.


패키지 이름 설정하기

Hibernate/Chapter 4 : 2008. 1. 20. 13:24


특징

  • (XML 설정 파일 이용 시)
  • Persistent 클래스 등록할 때, 패키지 이름까지 붙어있는 이름을 등록해야 한다.
  • 같은 패키지에 위치한 여러 클래스들을 등록할 때 패키지 이름을 매번 붙여주기가 귀찮다.

설정하기

기본 패키지 설정하기
<hibernate-mapping package="auction.model">
<classname="Item" table="ITEM">
...
</class>
</hibernate-mapping>
  • 애노테이션에서는 이런 설정이 필요 없겠지. 해당 클래스에 가서 직접 붙여주는데...

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.


쿼리에서 사용할 Entity 이름 설정하기

Hibernate/Chapter 4 : 2008. 1. 20. 13:24


특징

  • 기본으로 모든 클래스 이름들이 자동으로 HQL의 네임스페이스로 import 된다.
  • 즉, HQL에서 패키지 이름을 제외한 클래스 이름을 사용할 수 있다.
  • 서로 다른 패키지에 같은 이름의 클래스가 존재한다면, auto-import를 끄거나, 명시적으로 네임스페이스를 설정해야 한다.

설정하기

HQL에서 사용할 네임스페이스 설정하기
@Entity(name="AuctionItem")
public class Item {

}

모르는 것

  • 애노테이션을 사용해서 auto-import를 끄는 방법은?
  • auto-import를 끄면 패키지 이름이 붙어있는 클래스 이름을 네임스페이스로 사용하는 건가?

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.


Immutable Entity 만들기

Hibernate/Chapter 4 : 2008. 1. 20. 13:22


특징

  • 변하지 않아야 할 Persistent 객체가 있을 수 있다.
  • 이런 Persistent 클래스에는 필드로 직접 접근하도록 설정하고, accessor 메소드들을 만들지 않으면 된다.

설정하기

immutable entity 설정하기
@Entity
@org.hibernate.annotations.Entity(mutable=false)
@org.hibernate.annotations.AccessType("field")
public class Bid {

}
  • @AccessType은 하이버네이트가 Pesistent 클래스에 접근하는 방법을 표시한다.
  • 클래스, 메소드, 필드 위에 붙여서 좀 더 세밀한 설정이 가능하다.

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.


동적 SQL 생성

Hibernate/Chapter 4 : 2008. 1. 20. 13:21


특징

  • 기본으로 하이버네이트가 시작할 때, 각각의 Persistent 클래스와 관련된 CRUD 쿼리를 생성한다.
  • UPDATE 문은 모든 필드를 수정하도록 작성되어 있다.
  • Sometimes you can avoid generating any UPDATE statement, if the persistent class is mapped immutable.

설정하기

동적으로 쿼리 생성하도록 설정
@Entity
@org.hibernate.annotations.Entity(dynamicInsert=true, dynamicUpdate=true)
public class Category {
...
}
  • 아래에 있는 하이버네이트의 Entity 애노테이션이 위에 있는 Entity를 확장한다.

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.


주키 정하기

Hibernate/Chapter 4 : 2008. 1. 14. 17:04


Natural key vs Surrgate key

  • 후보키candidate key는 다음과 같은 특징을 가진다.
    • NULL 값을 갖지 않는다.
    • 유일한 값을 갖는다.
    • 값이 절대로 변하지 않는다.
  • A natural key is a key with business meaning: an attribute or combination of attributes that is unique by virtue of its business semantics.
  • Natural key를 주키로 사용해 왔지만, 다음과 같은 문제가 있다.
    • 변하지 않고, 고유하면서, 필수인 값을 찾기가 어렵다. 주키 값을 변경하는 작업은 완전 빡쎄며, 인덱스로 사용하기도 적절하지 않다.
    • 주로 복합키로 구성되는데, 이 것들이 보통 쿼리 작성, 스키마 수정, 유지보수를 어렵게 한다.
  • 그래서 Surrogate key 사용을 추천한다.
    • Surrogate keys have no business meaning—they're unique values generated by the database or application.

key generator 선택하기

  • Hibernate has several built-in identifier-generation strategies.
Generator name JPA Generation Type Option 설명
native AUTO   사용하는 DB에 따라서 sequence, hilo, identity를 알아서 선택함. 설정의 이식성을 고려한다면, 이 설정을 사용할 것.
identity IDENTITY   DB2, MySQL, MS SQL Server, Sybase, HypersonicSQL에 있는 identity 컬럼을 지원한다. long, short, int 타입의 값을 반환함.
sequence SEQUENCE sequence, parameters DB2, PostgreSQL, Oracle, SAP DB, Mckoi에서 sequence를 생성한다. long, short, int 타입의 값을 반환함. sequence 옵션을 사용해서 시퀀스의 이름을 설정할 수 있고, DDL에 추가할 시퀀스를 만들 때 필요한 추가 세팅이 필요할 때 parameters를 사용함.
increment     하이버네이트가 동작하면서 테이블의 주키 컬럼 값 중에 최대값을 읽은 다음 새로운 레코드를 추가할 때, 그 값을 1씩 증가시킴. 단일 서버에서 DB에 독립적으로 접근하는 경우 외에는 사용하지 말아라.
hilo   table, column, max_lo A high/low algorithm is an efficient way to generate identifiers of type long, given a table and column as a source of high values.
seqhilo   sequence, parameters, max_lo named database sequence에서 high 값을 걷는 것을 빼고 hilo와 동일하다.
  TABLE table, catalog, schema, pkColumnName, valueColumnName, pkColumnValue, allocationSize TABLE relies on a database table that holds the lastgenerated integer primary key value, and each generator is mapped to one row in this table.
uuid.hex   separator This generator is a 128-bit UUID (an algorithm that generates identifiers of type string, unique within a network).
guid     This generator provides a database-generated globally unique identifier string on MySQL and SQL Server.
select   key This generator retrieves a primary key assigned by a database trigger by selecting the row by some unique key and retrieving the primary key value
하이버네이트 identity generator 사용하기
@Entity
@org.hibernate.annotations.GenericGenerator(name="hibernate-uuid", strategy="uuid")
@Table(name="CATEGORY")
public class Category {

@Id
@GeneratedValue(generator="hibernate-uuid")
@Column(name="CATEGORY_ID")
private Long id;

public Long getId() {
return id;
}

}
  • hibernate-uuid라는 이름으로 uuid 생성기를 사용하는 코드.
  • You aren't limited to the built-in strategies; you can create your own identifier generator by implementing Hibernate's IdentifierGenerator interface.

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

기본 속성 맵핑하기- 실습  (2) 2008.01.22
Hibernate VS JPA  (2) 2008.01.20
컴포넌트 맵핑하기  (0) 2008.01.20
기본 속성 맵핑하기  (2) 2008.01.20
작명 지침 사용하기  (0) 2008.01.20
SQL문에 따옴표 사용하기  (0) 2008.01.20
패키지 이름 설정하기  (0) 2008.01.20
쿼리에서 사용할 Entity 이름 설정하기  (0) 2008.01.20
Immutable Entity 만들기  (0) 2008.01.20
동적 SQL 생성  (0) 2008.01.20
주키 정하기  (0) 2008.01.14
top

Write a comment.