如何使用Hibernate将枚举值保存到数据库?

19

我试图通过Hibernate用随机数据填充DB表。

但是我的代码向表中填充不兼容的数据(不完全是不兼容,它是在枚举中声明的元素的索引,例如:在ApartmentState中,FREE是第一个元素,它被设置为适当列的索引-0。 但我想要将FREE作为枚举或字符串放入)。

我无法确定为什么会出现这种情况。

以下是代码片段:

private List<Apartment> generateApartments() {
        for (int i = 1; i <= 3; i++) {
            for (int j = 2; j <= 5; j++) {
                Apartment apartment = new Apartment();
                // fill apartment
                apartment.setRoomName(generateRoomName());
                apartment.setPricePerHour(generatePrice());
                apartment.setApartmentState(FREE);
                apartment.setRating(getDesiredRating(j));
                apartment.setSleepPlaces(getDesiredPlaces(i));
                apartment.setActive(true);
                // save apartment
                apartments.add(apartment);
            }
        }
        return apartments;
    }

    private Apartment.SleepPlaces getDesiredPlaces(int i) {
        switch (i) {
            case 1:
                return ONE_PLACE;
            case 2:
                return TWO_PLACES;
            case 3:
                return THREE_PLACES;
        }
        return ONE_PLACE;
    }

    private Apartment.StarRating getDesiredRating(int j) {
        switch (j) {
            case 2:
                return TWO_STARS;
            case 3:
                return THREE_STARS;
            case 4:
                return FOUR_STARS;
            case 5:
                return FIVE_STARS;
        }
        return TWO_STARS;
    }

我需要在表格中填写一些枚举值,例如评级(2、3、4)和睡眠场所(1、2..)。但这会向表格中添加一些错误的数据。

这是工作台上的内容:

apartment

为什么它只将索引放入表格,而不是字符串或枚举类型。如何在未来恢复到期望的值。

这是公寓类的代码片段:

@Entity
@Table(name = "Apartments")
public class Apartment extends AbstractEntity implements Comparable<Apartment> {    
    private Integer id;
    private String roomName;
    private Double pricePerHour;
    private ApartmentState apartmentState;
    private StarRating rating;
    private SleepPlaces sleepPlaces;
    private Boolean active;

    public enum ApartmentState {
        FREE, REQUESTED, BOOKED, LIVED, CLEANING, PROCESSING
    }

    public enum StarRating {
        TWO_STARS("2 stars"), THREE_STARS("3 stars"), FOUR_STARS("4 stars"), FIVE_STARS("5 stars");

        private String description;

        private StarRating(String description) {
            this.description = description;
        }
        public String getDescription() {
            return description;
        }
    }

    public enum SleepPlaces {
        ONE_PLACE("1 person"), TWO_PLACES("2 persons"), THREE_PLACES("3 persons"), FOUR_PLACES("4 persons");

        private String count;

        private SleepPlaces(String count) {
            this.count = count;
        }
        public String getCount() {
            return count;
        }
    }

对我来说,最好的方法是将枚举类型作为枚举本身(可能在MySql Workbench中)或作为字符串(并使用Enum类中的name()和valueOf()函数)进行存储。

但是如何在Hibernate中实现呢?

如何解决这个问题?


可能是在Hibernate中使用枚举的重复问题。 - K.C.
https://sysdotoutdotprint.wordpress.com/2017/01/25/enumtype-ordinal-vs-enumtype-string/ - mel3kings
3个回答

49

您可以添加以下枚举来指示您希望保留字符串表示:

@Enumerated(EnumType.STRING)
private ApartmentState apartmentState;

9

在字段级别使用此注释:

@Enumerated(EnumType.STRING)

2
我需要添加@Embeddable到Java枚举中。
@Embeddable
 public enum ApartmentState {
        FREE, REQUESTED, BOOKED, LIVED, CLEANING, PROCESSING
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接