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.




: 1 : 2 : 3 : 4 : 5 : ··· : 11 :