【问题标题】:Spring Data repository doesn't load relationship after saveSpring Data存储库在保存后不加载关系
【发布时间】:2015-08-12 22:09:25
【问题描述】:

当 Book 对象被持久化时,Insert 上的触发器运行以创建事务记录(在单独的表中)。

当我创建 Book 的实例并保存它时,我希望在 transactions() 数组中看到这条记录,但它一直是空的。

Book book = new Book("Moby Dick", "Melville", "hardcover");
book = bookRepository.saveAndFlush(book);
if( book != null)
    assertTrue("There is no transaction history", book.transactions().size() > 0 );

这总是失败。这也是如此(我试图重新加载数据):

public int addBook()
{
    int bookID;
    Book book = new Book("Moby Dick", "Melville", "hardcover");
    book = bookRepository.saveAndFlush(book);
    if( book != null)
        bookID = book.getID();
    return bookID;
}

@Test
public void testNewBookTrans()
{
    int aBook = addBook();
    bookRepository.findAll();
    transactionRepository.findAll();
    Book book = bookRepository.findOne(bookID);
    if( book != null )
        assertTrue("Still no transactions", book.getTransactions().size() > 0);
}

然而,如果我让这个测试失败,重新启动 JUnit,然后查询同一本书,它有触发器添加的事务。

所以,一定有某种方法可以使数据库缓存失效或重新加载,但我没有看到它。

【问题讨论】:

  • 加入 2 个实体时遇到同样的问题

标签: java spring jpa caching triggers


【解决方案1】:

这是正常行为,因为新实体实例被缓存。您必须刷新它。

this answer

编辑: 回应您的评论。

关于缓存范围,取决于您如何在您的应用和使用的平台中操作它。在常见的容器管理事务和持久性上下文情况下,“* 1 级”缓存范围附加到持久性上下文,其生命周期取决于底层事务。它在事务范围开始时创建,在结束时释放。

我认为上述解决方案对您不可行,因为您不想在您已经找到的每个地方关心 引用 实例及其集合。 因此,如果提到持久性上下文的范围,您可以在保存实例后引用实例并调用方法flush

我的意思是,你可以在保存实例并刷新后编辑代码来引用(你必须刷新到数据库)

Book book = new Book("Moby Dick", "Melville", "hardcover");
book = bookRepository.saveAndFlush(book);
book = bookRepository.refresh(book);
if( book != null)

refresh 方法之后(您可能必须到implement the custom method),您将拥有这本书及其收藏的新鲜感。

如果你想刷新关联的事务实体(它们是实体?)你可以添加CascadeType.REFRESHBook.transactions集合 也是。

【讨论】:

  • 实际上,我在发布后立即看到了这一点,但是该答案中的任何一个选项对我来说都不是真正可行的,所以我保留了我的问题。我希望有另一种方法。缓存的范围是什么?我可以创建它再次检查数据库的条件吗?
  • 感谢您的帮助,但没有 refresh() 方法(如您在上面的评论中所述)。神话刷新方法的 body 是问题所要问的(你如何刷新??),所以这不会让我更进一步。
  • 哎呀,你是怎么定义BookRepository的?就像接口(用于添加查询方法)?在其他情况下发布它。
  • 我打算编辑帖子,但在此之前让我们确定一下:referh 是一些自定义命令还是只是另一种刷新方式? :-D @Guillermo
猜你喜欢
  • 2020-04-12
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2020-11-28
  • 2017-10-18
  • 1970-01-01
相关资源
最近更新 更多