Ánh xạ enum thành chuỗi ở chế độ ngủ đông


92

Tôi có một mô hình Category 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;

có một trường kiểu chuỗi. Ngoài ra, tôi có một enum Java đại diện cho một loại danh mục:

public enum CategoryType {
    INCOME, OUTCOME;
}

mà tôi muốn sử dụng thay vì loại chuỗi. SQL chấp nhận hai giá trị khác nhau trong tham số varchar: hoặc CategoryIncomehoặc CategoryOutcome. Tôi muốn lớp mô hình Category chấp nhận một biến enum - và ánh xạ nó bằng cách nào đó vào chuỗi bất cứ khi nào hibernate yêu cầu nó.

Có khả thi không?

Câu trả lời:


182

Có, là có thể. Nó phải là:

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

15
Bạn thậm chí có thể đi xa hơn và, bây giờ như JPA 2.1 được phát hành, sử dụng@Converter(autoApply = true) public class CategoryTypeConverter implements javax.persistence.AttributeConverter <CategoryType, String>
membersound

6
Đối với bất cứ ai có thể có cùng một vấn đề ..: tôi đã phải đặt chú thích này để phương thức getter của tôi thay vì lĩnh vực này, như thế này: @Enumerated(EnumType.STRING) public CategoryType getCategoryType() { return this.categoryType; }.
ZeroOne

Tôi đang ở hibernate.ddl-auto=updatechế độ và tôi phải thả bảng của mình xuống và để chế độ ngủ đông tạo lại nó để chuyển đổi enum của tôi từ int thành varchar. Hy vọng rằng nó sẽ giúp ai đó có vấn đề tương tự.
Arashsoft

Xem stackoverflow.com/questions/44864675/… nếu giá trị liệt kê của bạn đang được viết dưới dạng thứ tự mặc dù có chú thích được liệt kê.
metamaker

Tôi không đặt nó trên getter. Đưa nó vào khai báo biến hoạt động tốt, điều này tốt cho Lombok sử dụng @Data, v.v. Điều gì xảy ra nếu tôi muốn áp dụng điều này cho tất cả các Enum mà không cần chú thích mỗi Enum?
Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.