2011-07-14 9 views
2

私はHibernateを初めて使いました。以下のことを達成しようとしています。私が扱っているクラスは永続的で、DBに格納されています。これは次のようになります。Hibernateはファクトリを介してオブジェクトを作成します

となり、永続性のためにすべての必要なゲッターとセッターと注釈があります。クラスカードが関連して、この

CREATE TABLE Card (
    id SERIAL NOT NULL, 
    prototype CHAR(85) NOT NULL, 
    ... 
) 

クラスのようなDBのテーブルに格納されているCardPrototypeあり、それが文字列識別子によって識別され、そしてそれがすべてでデータベースに格納されていません。しかし、私はORMのオブジェクトのロード中Card.prototypeフィールドを解決するために使用する非静的メソッド

CardPrototype getPrototype (final String id) 

とファクトリクラスを持っています。 Hibernateでこれを達成するために私を助けてください。

答えて

1

@Typeアノテーションを使用して、独自の読み込みと保存を行うことができます。具体例については、How to store date/time and timestamps in UTC time zone with JPA and Hibernateを参照してください。特に、UtcTimestampTypeの答えを参照してください。

+0

このアイデアをありがとう。私はこのブログポスト[link](http://java.dzone.com/articles/annotating-custom-types)のサンプルを使って、UserTypeに基づいてStringからCardPrototypeを読み込んでマッピングするカスタムタイプを実装しました。 – jatvarthur

0

あなたは注釈を使用している場合は、試してみてください:

class Card { 
    private int id; 

    @ManyToOne 
    private CardPrototype prototype; // fixed this line 
    ... 

}; 
+1

こんにちは、私の誤植を修正していただきありがとうございます。この問題は、CardPrototypeがデータベースに存在する必要がありますが、そうではありません。これを使用すると例外があり、Hibernateは存在しないテーブルcardprototypeにSQLを実行します。 – jatvarthur

0

簡単な解決策は、あなたのカードのクラスでString prototypeIdフィールドを持っているだろう。そして、あなたが今、文字列ID

@PostLoad 
public void loadCardProtoType() { 
    CardPrototypeFactory factoryInstance = new CardPrototypeFactory(); 
    setCardPrototype(factoryInstance.getPrototype(this.prototypeId)); 
} 

を持っていたら、工場からオブジェクトを取得するために@PostLoadを使用しますが、カードのクラスを使用するときには、それにCardPrototypeインスタンスを持つことになります。また、prototypeIdをプライベートフィールドにすることもできます。

+0

はい、これは私の頭に浮かんだ最初のアイデアですが、実際にはクラスに余分なフィールドを持ち、毎回プロトタイプと同期させたくありません。 – jatvarthur

関連する問題