我是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
2条答案
按热度按时间j8ag8udp1#
这个问题有一个简单的解决方案,在最后一次查找操作中添加一个事务:
字符串
fslejnso2#
在同一个transaction中有缓存。所以第7步中的第二个find只是从缓存中获取值。会话绑定到transaction,所以清除你注入的会话是不工作的。你必须从panache中获取会话,然后在find方法之前运行clear方法。我认为启动一个新的transaction不是这个问题的关键。