我的数据库中有一个三元关系:User、Book 和 BookOrder。 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)
因为为一个操作创建两个事务是不安全的。相反,我在 Order
类的 reader
字段中添加了 cascade = Cascade.ALL
,但并没有解决问题。
如何让它在一次交易中发挥作用?
最佳答案
@OneToMany(cascade = CascadeType.ALL, mappedBy = "book")
是逆向关系,不是正向关系。也许将 CASCADE
添加到关系的另一端 (@ManyToOne
) 会产生不同的效果。
关于java - JPA实体在服务器重启之前不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37418319/