Pergunta

Muitas vezes, é útil ter um campo em um DAO cujo valor vem de uma enumeração Java. Um exemplo típico é um DAO de login, onde você geralmente tem um campo que caracteriza o usuário como "normal" ou "admin". No Hibernate, eu usaria as seguintes 2 objetos para representar essa relação de forma (semi-) typesafe:

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);
}

Isso funciona, mas acho que a classe UserType ungly e exigindo muita burocracia apenas para armazenar um par de valores. Idealmente, o Hibernate deve apoiar campos enum diretamente e criaria uma tabela extra para armazenar os valores de enumeração.

A minha pergunta é: Existe alguma maneira de mapear diretamente uma classe de enumeração em hibernação? Se não, é o meu padrão para representar enumerações bom o suficiente ou estou faltando alguma coisa? O que outros padrões fazer uso de pessoas?

Foi útil?

Solução

Usando o Hibernate ou JPA anotações:

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

UserType é apenas um padrão java 5 enum.

Eu não posso imaginar este é apenas limitado a apenas anotações, mas eu realmente não sei como fazer isso com arquivos HBM. Pode ser muito versão dependente, eu estou supondo, mas eu tenho certeza que o Hibernate 3.2+ é necessária.

Editar: é possível em um hbm, mas é um pouco confuso, ter um olhar para este tópico do fórum

Outras dicas

A partir da documentação Hibernate: http://www.hibernate.org/272.html

Você pode criar um novo typedef para cada uma de suas enums e referenciar os typedefs na tag propriedade.

Exemplo de Mapeamento - tag <type> em linha

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

Exemplo Mapeamento - usando <typedef>

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

  <class ...>
    <property name='suit' type='suit'/>
  </class>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top