加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

spring – 在@Transactional Junit Tests中使用域对象的双向关

发布时间:2020-12-15 01:45:34 所属栏目:大数据 来源:网络整理
导读:我有一个@Transactional JUnit测试设置,我想将一些测试数据保存到数据库,并测试关联是否正确. 但是,在测试关联时,它们总是评估为null,即使它在非事务性测试中有效. 我使用@Before注释保留两个对象: @Beforepublic void testData() { TestObjectOne o = new

我有一个@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());

该关联在域对象中定义为

在一:

   @OneToMany(mappedBy = "one",fetch = FetchType.EAGER)
   private List

成两半:

  @ManyToOne(optional = false)
  private One one;

当我没有以@Transactional运行测试时,它运行得很好.

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

最佳答案
您需要在保存之后和加载测试对象之前刷新并清除当前会话以进行断言.

当您保存TestObjectOne时,它的实例将保留在Hibernate会话中.比你创建TestObjectTwo并添加对o的引用并保存它所以这个实例现在也保存在Hibernate会话中.比你调用时获取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());
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读