2016-05-24 8 views
2

私のデータベースには、ユーザー、ブック、BookOrderの3つの関係があります。 JPAエンティティは次のように定義されています。JPAエンティティがサーバーを再起動するまで更新されない

class Book { 
    @Id 
    @Column(name = "ID") 
    private Integer id; 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "book") 
    private Collection<BookOrder> bookOrderCollection; 
    .... 
} 

class User { 
    @Id 
    @Column(name = "ID") 
    private Integer id; 

    @OneToMany(mappedBy = "reader") 
    private Collection<BookOrder> bookOrderCollection; 
    .... 
} 

class BookOrder { 
    @JoinColumn(name = "BOOK_ID", referencedColumnName = "ID") 
    @ManyToOne 
    private Book book; 

    @PrimaryKeyJoinColumn(name = "READER_ID", referencedColumnName = "ID") 
    @ManyToOne 
    private User reader; 
    .... 
} 

私が保存したい場合は、私はこれを行う:

Book book = ...; 
User reader = ...; 
BookOrder order = new BookOrder(); 
order.setBook(book); 
order.setReader(reader); 
book.getBookOrderCollection().add(order); 
reader.getBookOrderCollection().add(order); 
book.setQuantity(book.getQuantity() - 1); 
bookFacade.edit(book); 

そしてBookFacadeクラスは次のとおりです。では正常に動作

class BookFacade { 
    public void create(Book entity) { 
     getEntityManager().persist(entity); 
     getEntityManager().flush(); 
    } 

    public void edit(Book entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(Book entity) { 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public Book find(Object id) { 
     return getEntityManager().find(Book.class, id); 
    } 
} 

書籍の数量がデータベース内で更新され、BookOrderが挿入されていること。ただし、UserbookOrderCollectionは、サーバーを再起動するまで(データベースからリーダーをプルするまで)更新されません。

usersFacade.edit(reader)は、1回の操作で2つのトランザクションを作成するのが安全でないため、実行しないでください。代わりにcascade = Cascade.ALLOrderクラスのreaderフィールドに追加しましたが、問題は解決しませんでした。

どのようにして1つのトランザクション内で動作させることができますか?

+0

エンティティBookOrderとは何ですか? – mvera

+0

あなたの取引はどのように区切られていますか? – mvera

+0

BookOrderは書籍の注文を提示するエンティティです。アドレス、価格など – nrofis

答えて

2

@OneToMany(cascade = CascadeType.ALL, mappedBy = "book")は逆の関係であり、直接的な関係ではありません。リレーションのもう一方の側(@ManyToOne)にCASCADEを追加すると、別の効果があります。

+0

提案は答えですが、カスケードマージを追加することで、ブックとユーザーの変更が選択されますデータベースに同期されます。カスケードマージがなければ、JPAはbookOrderの変更だけを見て、BookとOrderのbookOrderコレクションは変更しません。データベースが更新されている間、キャッシュ内のブックと注文のエンティティは更新されず、キャッシュがクリアされるかキャッシュがクリアされるまでそのコレクションに変更が反映されません。 – Chris

+1

@Chris、 "問題の解決につながります"と"質問に対する答え "です。この答えは前者かもしれないが、後者ではない。あなたのコメントが答えの一部だったら、それは答えとしてもっと説得力があります。 –

関連する問題