Enumerations no Hibernate
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?
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>