質問

って既存のデータベースにしたフィルムの賃貸システム。それぞれのフィルムには、格付けの属性。アプリケーションを用いて制約制限は、許可された値をこの属性。

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いかの選択

  1. ことによって数値としてequalling Enum.ordinal(), るろう(厚);または
  2. 保存している文字列としてequalling Enum.name(). 注意: ない toString() としてあなたが期待するかもしれなので特にデフォルトのbehaviourfor Enum.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のようにすることができたことは複雑な既存のスキーマに立っています。

さんいらっしゃるかと思い二つの主要な欠点から、特定の列挙型:

  1. の制限を名()は、通常の().なぜならずマークゲッターと@Idをそのままい@Entity?
  2. 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");
(...)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top