Java Spring数据存储库不支持';保存后不加载关系
当一个Book对象被持久化时,Insert上的触发器将运行以创建一个事务记录(在一个单独的表中) 当我创建Book实例并保存它时,我希望在Java Spring数据存储库不支持';保存后不加载关系,java,spring,jpa,caching,triggers,Java,Spring,Jpa,Caching,Triggers,当一个Book对象被持久化时,Insert上的触发器将运行以创建一个事务记录(在一个单独的表中) 当我创建Book实例并保存它时,我希望在transactions()数组中看到该记录,但它一直是空的 Book book = new Book("Moby Dick", "Melville", "hardcover"); book = bookRepository.saveAndFlush(book); if( book != null) assertTrue("There is no tr
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 );
这总是失败的。这样做(我的旋转尝试重新加载数据):
但是,如果我让这个测试失败,重新启动JUnit,然后查询同一本书,它就拥有触发器添加的事务
因此,必须有某种方法使数据库缓存失效或重新加载,但我看不到它。这是缓存新实体实例的正常行为。你必须刷新它 看 编辑: 回应你的评论 关于缓存范围,取决于您在应用程序和使用的平台中如何操作它。在通用容器管理的事务和持久性上下文中,“*1级”缓存作用域附加到持久性上下文,该持久性上下文的生命周期取决于底层的传输。它在事务范围开始时创建,在事务范围结束时释放 我认为上述解决方案对您来说是不可行的,因为您不想关心在您已经找到的每个地方引用实例及其集合。 因此,如果持久性上下文的作用域是所提到的,那么您可以在保存实例并调用方法
flush
后,执行引用实例的技巧
我的意思是,您可以在保存实例和刷新后编辑代码以引用(您必须刷新到数据库)
在refresh
method(您可能必须这样做)之后,您将拥有一本全新的书籍及其收藏
如果您想刷新关联的交易实体(它们是实体?),yoo可以将CascadeType.refresh
添加到Book.transactions
集合中
也一样。事实上,我在发布后立即看到了这一点,但答案中的两个选项对我来说都不可行,所以我保留了我的问题。我希望还有别的办法。缓存的范围是什么?我可以创造条件让它再次检查数据库吗?我感谢你的帮助,但是没有
refresh()
方法(如上面的评论所述)。神话般的刷新方法的主体就是问题所要问的(你如何刷新??),所以这并不能让我进一步了解。啊,耶,你是如何定义图书存储库的?与inteface一样(用于添加查询方法)?在另一种情况下,发布它。我本来打算编辑帖子,但在此之前,让我们确定:refresh是某种自定义命令,还是只是另一种刷新方式-当我加入2个实体时,D@Guillermofaced遇到了同样的问题
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);
}
Book book = new Book("Moby Dick", "Melville", "hardcover");
book = bookRepository.saveAndFlush(book);
book = bookRepository.refresh(book);
if( book != null)