【发布时间】: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