기본 속성 맵핑하기- 실습

기본값 설정하는 방법을 테스트합니다.
– @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

2 thoughts on “기본 속성 맵핑하기- 실습”

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

    즐거운 hibernate공부하세요~

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

      방문 감사합니다~

Leave a Reply

Your email address will not be published. Required fields are marked *