Spring, Hibernate @OneToOne Проблема с транзакционным тестом - PullRequest
2 голосов
/ 26 июля 2011

У меня проблема при тестировании моего 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, ... все работает как надо. Есть ли способ заставить это работать? В противном случае мне всегда придется вручную удалять созданные объекты в базе данных после теста, что очень раздражает.

Надеясь на ответ.

Заранее спасибо.

1 Ответ

1 голос
/ 26 июля 2011

Вам нужно добавить clear() после последнего сброса.Если вы пропустите это, то hibernate вернет точно такой же экземпляр из своего внутреннего кэша, в котором не обновляется версия.

В любом случае, по моему личному мнению, это плохая практика - не устанавливать отношения с обеих сторонрука.- Потому что, если вы не установите его с обеих сторон, вы всегда должны позаботиться о том, чтобы объект был перезагружен из базы данных.И если вы не перезагрузите объект из базы данных, чем ... (см. Ваш тест).

...