Spring,Hibernate @OneToOne事务测试问题

时间:2011-07-26 13:05:39

标签: hibernate unit-testing spring transactional

我在测试我的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都不起作用。 endUser不受设备的限制。 如果我删除@Transactional,......一切正常。 有没有办法让这个工作? 否则,我将不得不在测试后手动删除数据库中创建的实体,这非常令人讨厌。

希望得到答案。

先谢谢。

1 个答案:

答案 0 :(得分:1)

您需要在上次刷新后添加clear()。如果你错过了,那么hibernate将从其内部缓存中返回完全相同的SAME实例,其中不会更新相关性。

无论如何,我个人认为不要手动设置双方关系。 - 因为如果不在两侧进行设置,则必须始终注意从数据库重新加载实体。如果你不从数据库重新加载实体而不是...(参见你的测试)。