如何使用 Hibernate 将枚举值保存到 DB?

Posted

技术标签:

【中文标题】如何使用 Hibernate 将枚举值保存到 DB?【英文标题】:how to save enum value to DB with Hibernate? 【发布时间】:2014-03-25 03:24:55 【问题描述】:

我尝试使用随机数据并通过 Hibernate 填充 DB 表。

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

我不明白为什么会发生这种情况。

这里是代码sn-p:

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 类的 sn-p:

@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 工作台上)或作为字符串(并使用 Enum 类中的 name()valueOf())。

但是如何用hibernate实现它。

如何解决这个问题?

【问题讨论】:

Enumerations in Hibernate的可能重复 sysdotoutdotprint.wordpress.com/2017/01/25/… 【参考方案1】:

我也必须添加

@Embeddable 到 java 枚举

@Embeddable
 public enum ApartmentState 
        FREE, REQUESTED, BOOKED, LIVED, CLEANING, PROCESSING
    

【讨论】:

【参考方案2】:

您可以添加以下枚举,以表明您希望字符串表示被持久化:

@Enumerated(EnumType.STRING)
private ApartmentState apartmentState;

【讨论】:

【参考方案3】:

在字段级别使用此注释:

@Enumerated(EnumType.STRING)

【讨论】:

以上是关于如何使用 Hibernate 将枚举值保存到 DB?的主要内容,如果未能解决你的问题,请参考以下文章

使用JPA将嵌套枚举保存到db

如何使用 JPA 和 Hibernate 映射 PostgreSQL 枚举

将枚举值保存到字典中

hibernate的枚举注解@Enumerated

如何使用 Hibernate 多对多将 jsp 页面中的多个选择标记中的数据保存到数据库

将枚举值保存到数据库