gpt4 book ai didi

java - 如何告诉 Hibernate 在运行 JUnit 测试时不要存储数据?

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:40 26 4
gpt4 key购买 nike

我想检查我的持久性逻辑,因此我正在运行一些测试用例。

存储库类:

@Repository
public class MyRepository {
public void add(Object obj) {
/* Do some stuff here */
getSession().persist(obj);
}
}

测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { Context.class})
public class MyTests {
@Inject
private MyRepository myRepository;

@Test
@Rollback(true)
public void foo() {
/* Test logic */
myRepository.add(obj);
Assert.assert...;
}
}

单元测试:MyTests.java 包含测试一些与持久性相关的内容的测试用例,但不是实际的 Hibernate 持久性本身,因此这就是 getSession.persist() 语句已过时的原因。

出于性能原因,我想阻止 Hibernate 将数据存储到我的数据库中,即使整个数据交互已回滚。我的方法是模拟:getSession().persist()。有没有更好的,或者更具体地说,更简单的方法来实现我的意图?

最佳答案

首先,Hibernate 中有不同的 id 生成器。如果identity生成器(并非所有数据库都支持),则为实体分配id,当调用session.persist方法时,insert查询将被调用。但是,例如,如果使用sequenceuuid生成器,则插入将不会被触发(至少立即)。

之后,如果调用方法 session.getsession.load 来加载持久化(在当前 session 中)对象,则 select 查询将不会被调用,因为它从 Hibernate 缓存中获取对象。但如果使用HQL来选择数据,则会调用select查询。此外,在它之前(默认情况下)也会调用持久对象的插入查询。

这可以通过FlushMode进行更改。默认设置为自动。这意味着:

The Session is sometimes flushed before query execution in order to ensure that queries never return stale state.

但是如果设置了getSession().setHibernateFlushMode(FlushMode.MANUAL):

The Session is only ever flushed when Session.flush() is explicitly called by the application.

这意味着在显式调用 session.flush 之前不会调用 insert 查询。如果进一步使用 session.getsession.load 方法,您的代码仍然可以工作(在当前 session 中)。但在 select HQL 查询的情况下 - 它不会找到该实体,因为它没有被持久化。所以要小心。

关于java - 如何告诉 Hibernate 在运行 JUnit 测试时不要存储数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com