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?

ducin
źródło

Odpowiedzi:

184

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

@Enumerated(EnumType.STRING)
@Column(name = "category_type")
private CategoryType categoryType;
dcernahoschi
źródło
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
1

Zaakceptowana odpowiedź nie jest wystarczająca dla PostgreSQL . Załączam implementację, która u mnie zadziałała:

https://stackoverflow.com/a/64021041/5279996

Braian Coronel
źródło
Dzięki, mój bracie
IonicMan