質問
って既存のデータベースにしたフィルムの賃貸システム。それぞれのフィルムには、格付けの属性。アプリケーションを用いて制約制限は、許可された値をこの属性。
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マの制約のオブジェクトです。ができな単に可を設けていないものについては、特別のcharの"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は動作しません。を取得し、以下の例外:
[TopLink警告]:2008.12.09 01:30:57.434--ServerSession(4729123)--例外の[TOPLINK-116](Oracle TopLink質-2.0.1(b09d-fcs(12/06/2007))):oracle.toplink.にあります。例外をスローしました。DescriptorException例外 説明:ない変換値をvalue[NC-17】 分野[。信用格付].マッピング:oracle.toplink.にあります。マッピング.DirectToFieldMapping[格付け-->フィルム。信用格付] 記述子:RelationalDescriptor(ド。fhw.nsdb.ます。映画--> [DatabaseTable(映画)])
乾杯
ティモ
解決
サウンドます:
カスタム型変換する <をサポートするためのOracleAS TopLinkの拡張/ P>
他のヒント
あなたは序値を格納しようとしています。あなたが値に関連付けられた文字列を持っていない場合は、値が正常に動作した文字列を格納します:
@Enumerated(EnumType.ORDINAL)
またこちらこちらではの力のJPAで取り扱いenums.とenumsいかの選択
- ことによって数値としてequalling
Enum.ordinal()
, るろう(厚);または - 保存している文字列としてequalling
Enum.name()
. 注意: ないtoString()
としてあなたが期待するかもしれなので特にデフォルトのbehaviourforEnum.toString()
ですのでname()
.
個人的には最高のオプション(2).
しかし、これらの問題にいることを定義する価値しかないvailidインスタンス名がJava(つまりハイフンを使用).でお客様の選択:
- 変更データ
- が続く文字列の分野では、暗黙的に変換しているとのことですが、それからenumsにオブジェクトまたは
- 利用規格外の拡張子のようにTypeConverters.
思い順(第昨として、優先順位付けを行う.
誰かとOracle TopLinkのコンバーターなんかを使用Toplink必需品の参考JPA1.0の実装であるサブセットの商Oracle Toplink製品です。
としてもっと強く変更されることをお薦めし EclipseLink.これは完全な実施によToplinkヘEclipselinkのリファレンス実装のJPA2.0が公開予定のよJavaOne中。
public enum Rating {
UNRATED ( "" ),
G ( "G" ),
PG ( "PG" ),
PG13 ( "PG-13" ),
R ( "R" ),
NC17 ( "NC-17" );
private String rating;
private static Map<String, Rating> ratings = new HashMap<String, Rating>();
static {
for (Rating r : EnumSet.allOf(Rating.class)) {
ratings.put(r.toString(), r);
}
}
private static Rating getRating(String rating) {
return ratings.get(rating);
}
private Rating(String rating) {
this.rating = rating;
}
@Override
public String toString() {
return rating;
}
}
私は、しかし、物事の注釈付きのTopLink側でマッピングを行う方法を知りません。
私は、TopLinkの内部を知らないが、私の推測では、以下である:それは他の方向にマッピングするRating.valueOf(のString)メソッドを使用しています。 )(のvalueOfを上書きすることはできませんので、あなたは正しいvalueOfメソッドを許可するために、Javaの命名規則に固執する必要があります。
public enum Rating {
UNRATED,
G,
PG,
PG_13 ,
R ,
NC_17 ;
public String getRating() {
return name().replace("_","-");;
}
}
getRatingは、「人間が読める」格付けを生成します。 「 - 」chanracterが列挙型識別子では許可されません。
ことに注意してください。もちろん、あなたがNC_17としてDBに値を格納する必要があります。
問題はないかと考えていることが成功したinceptedのようにすることができたことは複雑な既存のスキーマに立っています。
さんいらっしゃるかと思い二つの主要な欠点から、特定の列挙型:
- の制限を名()は、通常の().なぜならずマークゲッターと@Idをそのままい@Entity?
- Enumのテーマについての表現にはデータベースを伴うメタデータを含む適切な名前、記述名を、その国のものを現地化など。また、簡単にご利用の列挙型の柔軟性の団体をいう。
貢献した原因および採決 JPA_SPEC-47
これは何について
public String getRating{
return rating.toString();
}
pubic void setRating(String rating){
//parse rating string to rating enum
//JPA will use this getter to set the values when getting data from DB
}
@Transient
public Rating getRatingValue(){
return rating;
}
@Transient
public Rating setRatingValue(Rating rating){
this.rating = rating;
}
これで、あなたのDBとエンティティの両方の文字列として評価を使用しますが、他のすべてのために列挙型を使用します。
このアノテーションを使用します
@Column(columnDefinition="ENUM('User', 'Admin')")
列挙 パブリック列挙ParentalControlLevelsEnum { U( "U")、PG( "PG")、_12( "12")、_15( "15")、_18( "18");
private final String value;
ParentalControlLevelsEnum(final String value) {
this.value = value;
}
public String getValue() {
return value;
}
public static ParentalControlLevelsEnum fromString(final String value) {
for (ParentalControlLevelsEnum level : ParentalControlLevelsEnum.values()) {
if (level.getValue().equalsIgnoreCase(value)) {
return level;
}
}
return null;
}
}
比較 - >列挙
パブリッククラスRatingComparatorコンパレータを実装{
public int compare(final ParentalControlLevelsEnum o1, final ParentalControlLevelsEnum o2) {
if (o1.ordinal() < o2.ordinal()) {
return -1;
} else {
return 1;
}
}
}
解決!!!私の答え: http://programming.itags.org/development-tools/65254/
について、簡単には変換えのための名前を列挙型は、属性の値を"格'.お場合:ていれば、db値"NC-17"が必要に持っているenum:
enum格付け{
(...)
NC-17 ("NC-17");
(...)