如何在 JPA 中使用枚举

新手上路,请多包涵

我有一个电影租赁系统的现有数据库。每部电影都有一个评级属性。在 SQL 中,他们使用约束来限制该属性的允许值。

 CONSTRAINT film_rating_check CHECK
    ((((((((rating)::text = ''::text) OR
          ((rating)::text = 'G'::text)) OR
          ((rating)::text = 'PG'::text)) OR
          ((rating)::text = 'PG-13'::text)) OR
          ((rating)::text = 'R'::text)) OR
          ((rating)::text = 'NC-17'::text)))

我认为使用 Java 枚举将约束映射到对象世界会很好。但是由于“PG-13”和“NC-17”中的特殊字符,不可能简单地采用允许的值。所以我实现了以下枚举:

 public enum Rating {

    UNRATED ( "" ),
    G ( "G" ),
    PG ( "PG" ),
    PG13 ( "PG-13" ),
    R ( "R" ),
    NC17 ( "NC-17" );

    private String rating;

    private Rating(String rating) {
        this.rating = rating;
    }

    @Override
    public String toString() {
        return rating;
    }
}

@Entity
public class Film {
    ..
    @Enumerated(EnumType.STRING)
    private Rating rating;
    ..

使用 toString() 方法,方向 enum -> String 工作正常,但 String -> enum 不工作。我得到以下异常:

[TopLink 警告]:2008.12.09 01:30:57.434–ServerSession(4729123)–异常 [TOPLINK-116](Oracle TopLink Essentials - 2.0.1(构建 b09d-fcs(12/06/2007))): oracle.toplink.essentials.exceptions.DescriptorException 异常描述:没有为字段 [FILM.RATING] 中的值 [NC-17] 提供转换值。映射:oracle.toplink.essentials.mappings.DirectToFieldMapping[rating–>FILM.RATING] 描述符:RelationalDescriptor(de.fhw.nsdb.entities.Film –> [DatabaseTable(FILM)])

干杯

蒂莫

原文由 Timo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 772
2 个回答

您是否尝试过存储序数值。如果您没有与值关联的字符串,则存储字符串值可以正常工作:

 @Enumerated(EnumType.ORDINAL)

原文由 aledbf 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题