【问题标题】:Hibernate flush() and Cascade.PERSISTHibernate flush() 和 Cascade.PERSIST
【发布时间】:2012-01-29 11:46:21
【问题描述】:

我一直在研究 Hibernate,直到昨天我才真正关注 flush() 方法。

我了解在提交事务时会自动调用 flush()。

我正在开发一个示例图书馆管理系统。 AuthorsBooks 之间的关系是 ManyToMany

在 Author.java 中

@Fetch(FetchMode.SELECT)
@ManyToMany(mappedBy="authors", cascade={CascadeType.PERSIST, CascadeType.MERGE})
private Set<Book> books = new HashSet<Book>();

在 Book.java 中

@ManyToMany
@Cascade({org.hibernate.annotations.CascadeType.PERSIST})
@JoinTable(
       name="BookAuthor",
       joinColumns={@JoinColumn(name="bookId", referencedColumnName="id")},
       inverseJoinColumns={@JoinColumn(name="authorId", referencedColumnName="id")}
      )
private Set<Author> authors = new HashSet<Author>();

数据库中有一个映射表BookAuthor

这就是我正在做的。

  1. 将 FlushMode 设置为 MANUAL
  2. 从数据库中获取一本书
  3. 创建一个新作者。 (瞬态)
  4. 将作者添加到 Book 实例中的 authors 集。
  5. 开始交易
  6. 更新图书实例
  7. 提交事务。

与我的预期相反,我注意到更新 Book NOT 传播并保留了瞬态 Author 实例。 Author 实例仍然是瞬态的。

现在,如果我将 FlushMode 设置为 AUTO(默认),不仅会提交临时作者,还会在 BookAuthor 表中创建一个关系。

我很惊讶flush() 可以发挥如此重要的作用。

我是不是做错了什么?

问候,

沙杜尔。

【问题讨论】:

    标签: hibernate cascade flush object-state


    【解决方案1】:

    flush 是将更改写入数据库的方法。没有刷新,什么都不会写。所以很明显,如果您将刷新模式设置为手动并且从不调用刷新,则不会将任何内容写入数据库。

    【讨论】:

    • 哦,我的印象是,当我提交事务时,更改会写入数据库。顺便说一句,当我不使用 Hibernate 时,flush() 的等价物是什么?
    • 但是当我将 FlushMode 设置为 Manual 并简单地保存/保留一个简单的对象时,即使我不刷新它也能正常工作。在这种情况下它是如何工作的?
    • docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/…。它可能已写入数据库,因为您使用的是本机 ID 生成。在 JPA 中,flush 的等价物是……flush。见docs.oracle.com/javaee/6/api/javax/persistence/…。在纯 JDBC 中没有等价物,因为 JDBC 没有将持久对象保存在内存会话缓存中的概念。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多