chz*_*gla 5 junit spring associations transactional
我有一个@Transactional JUnit测试设置,我想将一些测试数据保存到数据库,并测试关联是否正确.但是,在测试关联时,它们总是评估为null,即使它在非事务性测试中有效.
我使用@Before注释保留两个对象:
@Before
public void testData() {
TestObjectOne o = new TestObjectOne();
o.setName("One");
repo.saveEntity(o); //autowired
TestObjectTwo t = new TestObjectTwo();
t.setOne(o);
t.setName("Two");
repo.saveEntity(t);
}
Run Code Online (Sandbox Code Playgroud)
在测试中访问这两个对象时,我得到了正确的实例:
TestObjectOne o = repo.getOneByName("One");
TestObjectOne t = repo.getTwoByName("Two");
Run Code Online (Sandbox Code Playgroud)
当检查t和之间的关联时o,我得到了正确的引用,因为我明确定义了该关联:
Assert.assertNotNull(t.getOne());
Run Code Online (Sandbox Code Playgroud)
但是当反过来检查时,对象o没有正确更新:
Assert.assertNotNull(o.getTwos());
Run Code Online (Sandbox Code Playgroud)
该关联在域对象中定义为
在One:
@OneToMany(mappedBy = "one", fetch = FetchType.EAGER)
private List<Two> twos;
Run Code Online (Sandbox Code Playgroud)
在Two:
@ManyToOne(optional = false)
private One one;
Run Code Online (Sandbox Code Playgroud)
当我没有以@Transactional运行测试时,它运行得很好.
编辑 保存测试中的实体而不是@Before方法,没有任何区别.
您需要在保存之后和加载断言的测试对象之前刷新并清除当前会话。
当您保存TestObjectOne o它的实例时,它会保留在 Hibernate 会话中。然后您创建TestObjectTwo t并添加引用o并保存它,因此该实例现在也保留在 Hibernate 会话中。与您调用 get 相比,Hibernate 会获取您之前创建的实例,而无需更新它们以反映实际状态。因此,您需要在加载之前刷新并清除会话 - 这样会话 L1 缓存将为空,并且实体将被正确加载。
public class MyTest {
@Before
public void setUp() {
TestObjectOne o = new TestObjectOne();
o.setName("One");
repo.saveEntity(o); //autowired
TestObjectTwo t = new TestObjectTwo();
t.setOne(o);
t.setName("Two");
repo.saveEntity(t);
/* push all changes to current transaction*/
repo.getSessionFactory().getCurrentSession().flush();
/* clean current session, so when loading objects they'll
be created from sratch and will contain above changes */
repo.getSessionFactory().getCurrentSession().clear();
}
@Test
public void test() {
TestObjectOne o = repo.getOneByName("One");
TestObjectOne t = repo.getTwoByName("Two");
Assert.assertNotNull(t.getOne());
Assert.assertNotNull(o.getTwos());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |