繁体   English   中英

保存后Spring Data存储库不加载关系

[英]Spring Data repository doesn't load relationship after save

保留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,然后查询同一本书,它具有触发器添加的事务。

因此,必须有某种方法可以使数据库缓存无效或重新加载它,但我没有看到它。

那是正常行为,导致新实体实例被缓存。 您必须刷新它。

看到这个答案

编辑:回应您的评论。

关于缓存范围,取决于您如何在所用的应用程序和平台中对其进行操作。 在常见的容器管理的事务和持久性上下文情况下,“ * 1级”高速缓存作用域附加到持久性上下文,而生命周期取决于基础事务。 它在事务作用域开始时创建,并在事务作用域结束时处置。

我想,所提到的解决方案是不可行的你,因为你不想计较refershing实例及其集合中的每个你已经找到地方。 因此,如果提到了持久性上下文的范围,则可以在保存实例并调用flush方法之后执行技巧来引用实例。

我的意思是,您只需要在保存实例并刷新之后就将代码编辑为refersh(必须刷新到数据库)即可。

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

使用refresh方法(您可能必须实现custom方法 )之后,您将获得该书及其集合的最新信息。

如果您想刷新关联的事务实体(它们是实体?),您也可以将CascadeType.REFRESH添加到Book.transactions集合中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM