Quarkus Panache Hibernate:如何清除该高速缓存,使实体世界匹配数据库状态?

kx7yvsdv  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(153)

我是quarkus的新手,似乎在单元测试中对hibernate的缓存有问题。测试注入了'UserTransaction'。测试应该检查数据库清理任务。
这就是我要做的:
1.创建实体
1.开始交易
1.保存遵循“活动记录”模式的实体,并使用“persistAndFlush”
1.提交事务
1.尝试通过“find(id)”从数据库中获取实体,以确保它已保存
1.运行cleanup任务(实体从数据库中删除)
1.再次尝试通过“find(id)”从数据库中获取实体,以确保它已被删除

Document doc;
    UUID uuid;
    doc = new Document();
    uuid = UUID.randomUUID();
    doc.uuid = uuid;
    doc.doc = new byte[0];
    doc.createdAt = Instant.now();
    transaction.begin();
    doc.persistAndFlush();
    transaction.commit();
    doc = Document.findById(uuid);
    Assertions.assertNotNull(doc);
    TimeUnit.SECONDS.sleep(Long.parseLong(maxAge)+1);
    scheduler.cleanUp();
    doc = Document.findById(uuid);
    Assertions.assertNull(doc);

字符串
第7步失败,因为'find(id)'返回了实体,尽管它已经不在数据库中了。
如果我跳过第5步,就不会发生这种情况!所以对我来说,这似乎是缓存问题。
我尝试注入'Session','SessionFactory'和'ObjectiyManager'来访问当前的Hibernate Session,但如果成功,则无法访问。
也许整个方法缺少了一些我没有得到的东西?如何使实体世界与像我这样的设置中的数据库相匹配?
任何提示和想法都是受欢迎的。
Tia

j8ag8udp

j8ag8udp1#

这个问题有一个简单的解决方案,在最后一次查找操作中添加一个事务:

transaction.begin();
doc = Document.findById(uuid);
transaction.commit();

字符串

fslejnso

fslejnso2#

在同一个transaction中有缓存。所以第7步中的第二个find只是从缓存中获取值。会话绑定到transaction,所以清除你注入的会话是不工作的。你必须从panache中获取会话,然后在find方法之前运行clear方法。我认为启动一个新的transaction不是这个问题的关键。

相关问题