spring - 在@Transactional Junit 测试中使用域对象的双向关联

标签 spring junit 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);
}

在测试中访问这两个对象时,我得到了正确的实例:
    TestObjectOne o = repo.getOneByName("One");
    TestObjectOne t = repo.getTwoByName("Two");

检查 t 之间的关联时和 o ,我得到了正确的引用,因为我明确定义了该关联:
    Assert.assertNotNull(t.getOne());

但是反过来检查时,对象 o未正确更新:
    Assert.assertNotNull(o.getTwos());

关联在域对象中定义为

One :
   @OneToMany(mappedBy = "one", fetch = FetchType.EAGER)
   private List<Two> twos;

Two :
  @ManyToOne(optional = false)
  private One one;

当我没有以@Transactional 的身份运行测试时,它运行良好。

编辑 在测试中保存实体而不是 @Before 方法,没有任何区别。

最佳答案

您需要在保存后和加载测试对象以进行断言之前刷新和清除当前 session 。

当您保存 TestObjectOne o它的实例保存在 Hibernate session 中。比你创造的TestObjectTwo t并添加对 o 的引用并保存它,以便此实例现在也保存在 Hibernate session 中。比当您调用 get Hibernate 时获取您之前创建的实例而不更新它们以反射(reflect)实际状态时。因此,您需要在加载之前刷新并清除 session - session 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());
    }
}

关于spring - 在@Transactional Junit 测试中使用域对象的双向关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6666973/

相关文章:

java - Spring 在 DispatcherServlet 中未找到带有 URI[require.js] 的 HTTP 请求的映射

java - Jetty 字符集 utf-8 与 字符集 UTF-8

java - Spring测试中连接bean时获取包不存在

uml - 我可以在类图中包含一个独立的类吗?

java - ApplicationContext 和 beans 检索

java - 我收到以下代码的 "java.lang.Exception: Method tearDown should have no parameters"& result.getStatus 为 null

java - 测试两个 JSON 对象的相等性,忽略 Java 中的子顺序

ruby-on-rails - 如何在同一模型中进行 has_many 和 has_one 关联?

ruby-on-rails - 通过带作用域的关联保存时丢失属性 (Rails 4.0.0)

java - 如何在 Spring MVC 中使用 JasperReports?