Mapowanie wyliczenia na ciąg w trybie hibernacji


93

Mam model kategorii 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;

które mają pole typu string. Mam również wyliczenie Java, które reprezentuje typ kategorii:

public enum CategoryType {
    INCOME, OUTCOME;
}

którego chciałbym użyć zamiast typu string. SQL akceptuje dwie różne wartości parametru varchar: albo CategoryIncomelub CategoryOutcome. Chciałbym, aby klasa modelu Category akceptowała zmienną wyliczeniową - i odwzorowywała ją w jakiś sposób na łańcuch, gdy zażąda tego hibernacja.

Czy to możliwe?

Odpowiedzi:


184

Tak, jest to możliwe. Powinno być:

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

15
Możesz nawet pójść dalej i, teraz, gdy JPA 2.1 zostanie wydany, użyj@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
Membersound

6
Dla każdego, kto może mieć ten sam problem ..: Miałem się umieścić adnotację do mojego sposobu pochłaniacza zamiast tej dziedzinie, podobnie jak to: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne

Byłem w hibernate.ddl-auto=updatetrybie i musiałem upuścić stół i pozwolić hibernacji utworzyć go ponownie, aby przekonwertować wyliczenie z int na varchar. Mam nadzieję, że pomoże to komuś z podobnym problemem.
Arashsoft

Zobacz stackoverflow.com/questions/44864675/…, jeśli wartość wyliczenia jest zapisywana jako porządkowa pomimo adnotacji wyliczeniowej.
metamaker

Nie umieszczam go na getterze. Umieszczenie go na deklaracji zmiennej działa dobrze, co jest dobre dla Lombok przy użyciu @Data itp. A co jeśli chcę zastosować to do wszystkich wyliczeń bez dodawania adnotacji do każdego z nich?
Andrew

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.