java - JPA实体在服务器重启之前不更新

标签 java jpa

我的数据库中有一个三元关系: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。但是,UserbookOrderCollection 直到服务器重新启动(当我从数据库中拉出阅读器时)才会更新。

我想避免执行 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/

相关文章:

java - 什么是对 Java GC 最好的循环图表示

java - proguard 是否可以混淆静态字符串常量?

java - spring boot中的共享gradle项目不包含yml文件

java - Spring JPA -> 将 ResultSet 映射到不存在的实体

java - 首次发布应用程序时,持久性单元无法注入(inject),但重新启动应用程序时注入(inject)成功

java - Hibernate:实体副本 [Event#XXX] 已分配给不同的实体 [Event#XXX]

java - 如何在 WildFly 每次启动时创建一个新的 server.log?

JAVA客户端-服务器软件,多台机器

java - 具有两个参数的 Hibernate CriteriaBuilder

java - @DiffIgnore 和 @ShallowReference 在回调中导致奇怪的行为