2011-02-28 20 views
3

私はJPSQL/Hibernate over PGSQL DBを使用しています。JPA:別のエンティティが作成されるたびにエンティティを作成する

私のアプリケーションにはエンティティがあり、最初のエンティティが永続化されるたびに別のエンティティ(別の種類のもの)を保持したいと考えています。たとえば、「ORDER」が作成されるたびに、空の「ORDER_INVOICE」エンティティをただちに保持して、オーダーに接続する必要があります。これらは2つの異なるテーブルにあります。

最初はORDERエンティティの@PostPersist関数を記述し、その中にORDER_INVOICEを永続させることを考えましたが、私の問題はこのコンテキストでEntity Managerがないことです。

私は、すべてのORDER永続性が維持されるたびにORDER_INVOICEを保持することを忘れないようにしています。

これは正しい方法ですか?もしそうなら、EMをPostPersistにどうやって渡すのですか?もしそうでなければ、もっと良い方法は何でしょうか?

+0

「作成済み」とは、「保存済み」という意味ですか? – MRalwasser

+0

@Malwasser:はい。 –

+0

JPA 1.0の仕様からは、一般的にポータブルアプリケーションはEntityManagerやQueryの操作を呼び出さず、 他のエンティティインスタンスにアクセスしたり、ライフサイクルコールバックメソッドの関係を変更したりしてはいけません。 。たぶんあなたは@ JBのような解決策を使用することができますNizetは述べています。 – MRalwasser

答えて

3

あなたは単にマスターエンティティのコンストラクタでそれを作成し、関係にcascade = persistを設定するのはなぜですか?場合

@Entity 
public class Order { 

    @OneToMany(mappedBy = "order", cascade=CascadeType.PERSIST) 
    private List<Invoice> invoices = new ArrayList<Invoice>(); 

    /** 
    * Constructor called by JPA when an entity is loaded from DB 
    */ 
    protected Order() { 
    } 

    /** 
    * Factory method; which creates an order and its default invoice 
    */ 
    public static Order createOrder() { 
     Order o = new Order(); 
     Invoice i = new Invoice(); 
     i.setOrder(o); 
     o.invoices.add(i); 
    } 

    // ... 
} 

@Entity 
public class Order { 

    @OneToMany(mappedBy = "order", cascade=CascadeType.PERSIST) 
    private List<Invoice> invoices = new ArrayList<Invoice>(); 

    public Order() { 
     Invoice i = new Invoice(); 
     i.setOrder(this); 
     this.invoices.add(i); 
    } 

    // ... 
} 

EDITED:

新しい請求書を作成注文のコンストラクタは、(例えば、JPAで)呼び出されるたびに回避するには、この種のコードを使用することができますファクトリメソッドによってインスタンスが生成された後でもこのオーダーが保持されている場合、インボイスも永続化されます(カスケードのおかげで)。注文が保持されていない場合は、ある時点でガベージコレクションされ、デフォルトの請求書にもなります。

+0

注文のすべての構築は新しい請求書を自動的に作成するので、注文を永続させるときにのみ作成することができます(これは1回のみ実行されます)。また、私の場合の注文は、(これは変更することができますが)インボイスについては知らない/気にしません。 –

+1

デフォルトコンストラクタを保護することができます。データベースからエンティティをロードするときには、依然としてJPAエンジンによって呼び出されます。私の答えのように、注文とそのデフォルトの請求書を作成する静的ファクトリメソッドを追加します。 –

+0

私はあなたが何を意味するかを見ます。それで私は繰り返し言います - 私は新しい注文を作成する方法2)必要なすべてのデータを注文に記入する3)注文を保存する4)請求書を作成する5)注文に請求書を接続する6)請求書を保存します。いいと思います。それはあなたが意味することですか? –

関連する問題