Hibernate의 열거 형


82

값이 Java 열거에서 나오는 DAO에 필드를 갖는 것이 종종 유용합니다. 일반적인 예는 일반적으로 사용자를 "NORMAL"또는 "ADMIN"으로 특성화하는 필드가있는 로그인 DAO입니다. Hibernate에서 나는이 관계를 (semi-) typesafe 방식으로 표현하기 위해 다음 2 개의 객체를 사용할 것입니다.

class User {
    String username;
    String passwd;
    UserType type;
}

class UserType {
    private enum Type {ADMIN, NORMAL};
    private String type;

    //Setters/Getters for Hibernate
    public void setType(String type);
    public String getType();

    //Setters/Getters for user
    public void setUserType(UserType.Type t);
    public UserType.Type getUserType();

    public static UserType fromType(UserType.Type t);
}

이것은 작동하지만 UserType 클래스가 엉망이고 몇 가지 값을 저장하기 위해 너무 많은 관료가 필요하다는 것을 알았습니다. 이상적으로, Hibernate는 열거 형 필드를 직접 지원해야하며 열거 형 값을 저장할 추가 테이블을 생성해야합니다.

내 질문은 : Hibernate에서 열거 형 클래스를 직접 매핑하는 방법이 있습니까? 그렇지 않다면 열거 형을 나타내는 패턴이 충분합니까? 아니면 뭔가 빠졌습니까? 사람들이 사용하는 다른 패턴은 무엇입니까?

답변:


110

최대 절전 모드 또는 JPA 주석 사용 :

class User {
   @Enumerated(EnumType.STRING)
   UserType type
}

UserType은 표준 Java 5 열거 형입니다.

나는 이것이 단지 주석에만 국한되어 있다고 상상할 수 없지만 실제로 hbm 파일로 이것을 수행하는 방법을 모릅니다. 버전에 따라 다를 수 있습니다. 추측하지만 최대 절전 모드 3.2 이상이 필요합니다.

편집 : hbm에서 가능하지만 약간 지저분합니다.이 포럼 스레드를 살펴보십시오.


3
int에 더 효율적으로 매핑되는 @Enumerated (EnumType.ORDINAL) 수 있습니까?
Lee Chee Kiam 2011 년

4
아마도 더 효율적이지만 실제 시스템에서 차이를 측정 할 수 없다는 것에 돈을 걸었습니다. @Enumerated 만 수행하면 EnumType.ORDINAL이 실제로 기본값입니다. 대부분의 사람들 (특히 DBA)은 DB에서 열거 형 이름을 선호하는 경향이 있다고 생각합니다.
Gareth Davis

1
이 열거 형의 열 길이를 어떻게 변경할 수 있습니까? Column 주석을 추가하려고했지만 영광스럽지 않습니까?
Kannan Ekanath 2011 년

2
다른 질문으로 물어봐야합니다.
Gareth Davis

2
순서에 관계없이 Enum에 추가 요소를 추가 할 수 있으므로 ORDINAL 대신 STRING을 사용하십시오.
Matthew Daumen 2014 년

14

Hibernate 문서에서 : http://www.hibernate.org/272.html

각 열거 형에 대해 새 typedef를 만들고 속성 태그에서 typedef를 참조 할 수 있습니다.

매핑 예-인라인 <type>태그

  <property name='suit'>
    <type name="EnumUserType">
      <param name="enumClassName">com.company.project.Suit</param>
    </type>
  </property>

예제 매핑-사용 <typedef>

  <typedef name="suit" class='EnumUserType'>
      <param name="enumClassName">com.company.project.Suit</param>
  </typedef>

  <class ...>
    <property name='suit' type='suit'/>
  </class>

감사. 나는 이미 그 해결책을 알고있었습니다. 문제는 모든 열거 형이 최대 절전 모드 내부 유형을 사용해야한다는 것입니다.이 경우 제 경우와 같이 DAO를 DTO로 사용하는 경우 문제가 발생할 수 있습니다. 더 나은 솔루션이 실제로 여기에 설명되어 있습니다. hibernate.org/273.html
Georgios Gousios

1
새로운 버전의 매개 변수 이름이 있습니다 enumClass대신 enumClassName.
Ryan Ransford 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.