私のデータベースには、ユーザー、ブック、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
が挿入されていること。ただし、User
のbookOrderCollection
は、サーバーを再起動するまで(データベースからリーダーをプルするまで)更新されません。
usersFacade.edit(reader)
は、1回の操作で2つのトランザクションを作成するのが安全でないため、実行しないでください。代わりにcascade = Cascade.ALL
をOrder
クラスのreader
フィールドに追加しましたが、問題は解決しませんでした。
どのようにして1つのトランザクション内で動作させることができますか?
エンティティBookOrderとは何ですか? – mvera
あなたの取引はどのように区切られていますか? – mvera
BookOrderは書籍の注文を提示するエンティティです。アドレス、価格など – nrofis