映画レンタル システムの既存のデータベースがあります。各映画には評価属性があります。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 (Build 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)])
乾杯
ティモ