java - java如何在JPA中使用枚举

  显示原文与译文双语对照的内容
60 1

我有一个电影租赁系统的现有数据库。每部影片都有评级属性。在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 enum 将约束映射到对象世界是很好的。但是,由于" pg-13"和" nc-17"中的特殊字符,不可能简单地接受允许的值。因此,我实现了以下 enum:

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 -> 字符串工作正常,但字符串-> enum 不工作。我得到以下异常:

[TopLink Warning]:. 434 --ServerSession ( 4729123 )---Exception [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 ( w 。fhw 。nsdb 。实体。膜 --> [DatabaseTable(FILM)] )

cheers!

Timo

时间:原作者:0个回答

131 1

似乎你需要添加对自定义类型的支持:

扩展 OracleAS TopLink以支持自定义类型转换。

原作者:
70 4

你是否尝试存储序号值。如果没有与值相关联的字符串,存储字符串值的工作方式很好:

@Enumerated(EnumType.ORDINAL)
原作者:
...