Asignación de enumeración a cadena en hibernación

92

Tengo un modelo de categoría 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 tienen un campo de tipo cadena. También tengo una enumeración de Java que representa un tipo de categoría:

public enum CategoryType {
    INCOME, OUTCOME;
}

que me gustaría usar en lugar del tipo de cadena. SQL acepta dos valores distintos en el parámetro varchar: CategoryIncomeo CategoryOutcome. Me gustaría que la clase de modelo Category aceptara una variable de enumeración y la asignara de alguna manera a la cadena cada vez que hibernate lo solicite.

¿Es posible?

ducin
fuente

Respuestas:

182

Si, es posible. Debería ser:

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;
dcernahoschi
fuente
15
Incluso puede ir más allá y, ahora que se lanza JPA 2.1, use@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membersound
6
Para cualquier persona que pueda tener el mismo problema ..: que tenía que poner esta anotación a mi método getter en lugar del campo, como esto: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne
Estaba en hibernate.ddl-auto=updatemodo y tuve que soltar mi tabla y dejar que hibernate la creara nuevamente para convertir mi enumeración de int a varchar. Con suerte, ayudará a alguien con un problema similar.
Arashsoft
Consulte stackoverflow.com/questions/44864675/… si su valor de enumeración se escribe como ordinal a pesar de la anotación enumerada.
metamaker
No lo pongo en el getter. Ponerlo en la declaración de variable funciona bien, lo cual es bueno para Lombok usando @Data, etc. ¿Qué pasa si quiero aplicar esto a todos los Enums sin anotar cada uno?
Andrew