![](/img/trans.png)
[英]Spring Jpa Data Repository save (update) with LinkedEntity for ManyToMany relationship
[英]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.