【问题标题】:Spring, Hibernate @OneToOne Problem with Transactional TestSpring,Hibernate @OneToOne 事务测试问题
【发布时间】:2011-07-26 13:05:39
【问题描述】:

我在测试我的 DAOObject 时遇到问题。我有两个由@oneToOne 关系链接的实体。 类是:

@Entity
@Table
public class Device extends HyEntity {

    @OneToOne(mappedBy = "device")
    private EndUser endUser;
    //getters+setters
}

@Entity
@Table
public class EndUser extends HyEntity {

    private String firstname;
    private String lastname;
    @OneToOne
    private Device device;
    //getters+setters
}

在 DAO 中,我执行以下操作:

    Device d1 = new Device();

    EndUser e1 = new EndUser();
    e1.setFirstname("Hans");
    e1.setLastname("Muster");
    e1.setDevice(d1);

    repo.saveEntity(d1);
    repo.saveEntity(e1);
    sf.getCurrentSession().flush();
    repo.updateEntity(d1);
    sf.getCurrentSession().flush();

    Assert.notNull(repo.getEndUserById(e1.getId()));
    Assert.notNull(repo.getEndUserById(e1.getId()).getDevice());
    Assert.notNull(repo.getDeviceById(d1.getId()));

    sf.getCurrentSession().flush();
    d1 = repo.getDeviceById(d1.getId());
    Hibernate.initialize(d1); 
    Hibernate.initialize(d1.getEndUser());
    Assert.notNull(repo.getDeviceById(d1.getId()).getEndUser()); //FAILS endUser of Device is always NULL

如您所见, session.flush() 和 Hibernate.Initalize 都不起作用。最终用户未分配给设备。 如果我删除@Transactional,...一切正常。 有没有办法让它工作? 否则我总是不得不在测试后手动删除数据库中创建的实体,这很烦人。

希望得到答案。

提前致谢。

【问题讨论】:

  • 也许d1.setEndUser(e1) 有帮助?
  • 我猜这会有所帮助。我认为问题在于它在非事务性测试中按预期工作,但在事务性测试中却没有。
  • 是的,如果我添加 d1.setEndUser(e1); 就可以了,但这只是一种解决方法……我认为没有这种解决方法应该可以让它工作。没有@transactional 它正在工作......
  • 发布您的 Spring 事务设置。另外,我想相信您正在线程中执行Hibernate.initialize(d1);,否则不必通过会话调用获取对象然后重新初始化它。会建议您将会话刷新委托给 opensessioninviewinterceptor 来处理,而不是明确地进行。

标签: hibernate unit-testing spring transactional


【解决方案1】:

您需要在最后一次刷新后添加clear()。如果你错过了,hibernate 会从它的内部缓存中返回完全相同的实例,其中关系没有更新。

无论如何,在我个人看来,不手动设置双方的关系是不好的做法。 -- 因为如果你不在两边都设置它,你总是必须注意从数据库中重新加载实体。如果您不从数据库中重新加载实体...(请参阅您的测试)。

【讨论】:

  • 非常感谢。 clear() 成功了。我注意到有某种缓存,但我不知道它在会话中,而 clear() 会清除它。 ^^
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多