Mappatura da enum a stringa in ibernazione


92

Ho un modello di ibernazione di categoria:

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

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

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

che hanno un campo stringa di tipo. Inoltre ho un'enumerazione Java che rappresenta un tipo di categoria:

public enum CategoryType {
    INCOME, OUTCOME;
}

che vorrei usare al posto del tipo stringa. L'SQL accetta due valori distinti nel parametro varchar: o CategoryIncomeo CategoryOutcome. Vorrei che la classe del modello Category accettasse una variabile enum e la mappasse in qualche modo alla stringa ogni volta che hibernate lo richiede.

È possibile?

Risposte:


182

Sì, è possibile. Dovrebbe essere:

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

15
Puoi anche andare oltre e, ora che JPA 2.1 viene rilasciato, usa@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membersound

6
Per tutti coloro che potrebbero avere lo stesso problema ..: ho dovuto mettere questa annotazione nel mio metodo getter al posto del campo, in questo modo: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne

Ero in hibernate.ddl-auto=updatemodalità e ho dovuto abbandonare la mia tabella e lasciare che hibernate la creasse di nuovo per convertire la mia enum da int a varchar. Si spera che aiuti qualcuno con problemi simili.
Arashsoft

Vedi stackoverflow.com/questions/44864675/… se il tuo valore di enumerazione viene scritto come ordinale nonostante l'annotazione enumerata.
metamaker

Non lo metto sul getter. Metterlo nella dichiarazione della variabile funziona bene, il che è positivo per Lombok che usa @Data, ecc. E se volessi applicarlo a tutti gli enumerativi senza annotare ciascuno di essi?
Andrew
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.