【问题标题】:Spring JPA is not saving custom values enum type to databaseSpring JPA 未将自定义值枚举类型保存到数据库
【发布时间】:2018-04-22 05:53:46
【问题描述】:

我有一个如下定义的枚举,其中值应该是 -2、-1、0、1、2:

public enum Rating {

    EXTREMELY_DISSATISIFIED(-2),
    DISSATISFIED(-1),
    NEUTRAL(0),
    SATISFIED(1),
    EXTREMELY_DISSATIFIED(2);

    private final int rating;

    Rating(int rating) {
        this.rating = rating;
    }

    public int getValue() {
        return rating;
    }
}

在我的模型中,我有一个名为rating 的属性,如下所示:

@Entity
public class Feedback {
    @Column(nullable=false)
    private Rating rating;

    public Feedback() {}

    public Rating getRating() {
        return rating;
    }
    public void setRating(Rating rating) {
        this.rating = rating;
    }
}

然后,通过 RESTful API,我使用以下代码保存评分:

@Service
public class FeedbackService {

    @Autowired
    private FeedbackRepository feedbackRepository;

    public Feedback addFeedback(Feedback feedback) {
        return feedbackRepository.save(feedback);
    }
}

所以,当我POST 一个请求时:

{
   "rating": "EXTREMELY_DISSATISFIED"
}

我希望在 POSTgres 数据库中看到值 -2。但是,我仍然看到 0,因为普通枚举会以 0 开头。如何调整数据库以将值存储为 -2、-1、0、1 和 2?

【问题讨论】:

标签: java spring postgresql jpa enums


【解决方案1】:

您始终可以使用AttributeConverter,它可以自定义存储值。 HERE 是一个很好的教程。

【讨论】:

    【解决方案2】:

    您可以将自定义转换器与 @Convert annotationAttributeConverter 像这样:

    @Convert(converter = EnumToIntValue.class)
    private Rating rating;
    

    然后这样写你的EnumToIntValue转换器类:

    public class EnumToIntValue implements AttributeConverter<Rating, Integer> {
    
        @Override
        public Integer convertToDatabaseColumn(final Rating rating) {
            return rating.getValue();
        }
    
        @Override
        public Rating convertToEntityAttribute(final int dbData) {
            if (dbData == -2) {
                return Rating.EXTREMELY_DISSATISIFIED;
            } else if (dbData == -1) {
                return Rating.DISSATISFIED;
            } else if (dbData == 0) {
                return Rating.NEUTRAL;
            } else if (dbData == 1) {
                return Rating.SATISFIED;
            }else if(dbData == 2){
                return Rating.EXTREMELY_SATIFIED;
            }else{
                return null
            }
        }
    }
    

    【讨论】:

    • 我决定使用字符串值而不是 int,因为与使其工作的复杂性相比,这对我的情况没有太大影响。
    猜你喜欢
    • 2012-06-02
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多