Mapeando enum para string em hibernação


92

Eu tenho um modelo de categoria Hibernate:

@Entity
@Table(name = "category")
public class Category {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private long id;

    @Column(name = "type")
    private String type;

que têm um campo de tipo de string. Também tenho um enum Java que representa um tipo de categoria:

public enum CategoryType {
    INCOME, OUTCOME;
}

que eu gostaria de usar em vez do tipo string. O SQL aceita dois valores distintos no parâmetro varchar: CategoryIncomeou CategoryOutcome. Eu gostaria que a classe do modelo Category aceitasse uma variável enum - e mapeie-a de alguma forma para a string sempre que o hibernate solicitar.

É possível?

Respostas:


182

Sim, é possível. Deveria ser:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;

15
Você pode ir mais longe e, agora que o JPA 2.1 foi lançado, use@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membros em

6
Para qualquer um que pode ter o mesmo problema ..: Eu tive que colocar essa anotação para o meu método getter em vez do campo, como este: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne

Eu estava no hibernate.ddl-auto=updatemodo e tive que largar minha tabela e deixar o hibernate criá-la novamente para converter meu enum de int para varchar. Espero que ajude alguém com problema semelhante.
Arashsoft de

Consulte stackoverflow.com/questions/44864675/… se seu valor de enumeração está sendo escrito como ordinal apesar da anotação Enumerada.
metamaker

Eu não coloco isso no getter. Colocá-lo na declaração de variável funciona bem, o que é bom para o Lombok usando @Data etc. E se eu quiser aplicar isso a todos os Enums sem anotar cada um?
Andrew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.