Я новичок в спящем режиме и стараюсь начать с тестирования из ворот. Я был испорчен легкостью использования Grails в этой области ... Я использую Springframework 3.0.6 с Hibernate 3.6.8 и Junit 4.9.
Я пытаюсь понять, почему следующий тест не «видит» набор EventAttribute в объекте Event как набор объектов HibernateProxy, а вместо этого просто пустым. Кроме того, если я следую некоторым из составных свойств Event (свойств, сделанных из объектов в других таблицах), я тоже не вижу значений, но вместо них null.
Объект сохраняет очень хорошо в dao, и я вижу простые свойства (свойства в одной таблице). Однако assertNotNull не проходит тест ниже.
Я предполагаю, что что-то не так с моей конфигурацией тестирования, так что сессия уже закрыта. Мысли?
Модели:
@Entity
@Table(name = "event")
public class Event {
/**
... some other properties ...
*/
@OneToMany(mappedBy = "event")
private Set eventAttributes = new HashSet(0);
/**
... getters and setters ...
*/
}
@Entity
@Table(name = "event_attribute")
public class EventAttribute {
/**
... some other properties ...
*/
@ManyToOne(fetch = FetchType.LAZY)
@ForeignKey(name = "FK_event_attribute_event")
@JoinColumn(name = "event_id", nullable = false)
private Event event;
/**
... getters and setters ...
*/
}
Моя тестовая конфигурация:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("dao-testConfig.xml")
@TransactionConfiguration(defaultRollback = false)
@Transactional
public class EventAttributeDaoTest {
@Test
public void save(){
EventAttribute eventAttribute = new EventAttribute("a key", "a value", event);
dao.save(eventAttribute);
Event event2 = eventDao.getEventById(event.getId());
assertNotNull(event2.getEventAttributes());
}
}
Проблема в том, что спящий режим НЕ будет поддерживать оба конца двунаправленного повторного действия для вас.
Поэтому до тех пор, пока вы не перезагрузите событие из базы данных, набор не будет обновлен. В вашем случае проблема заключается в том, что event2
больше не будет загружаться из базы данных, потому что она уже присутствует в текущем сеансе спящего режима.
You can prove that by assertSame(event2, event) //notice that SAME not only EQUALS
Поэтому, если вы очистите сеанс до того, как загрузите второе событие, то hibernate действительно загрузит его из db и создаст экземпляр нового объекта. В этом случае он также инициализирует set
так, как вы ожидаете.
But: I my humble opinion, this is poor code. Better is to maintain both sides of the relationship by hand. So if you create an new EventAttribute, it should itselfe register to the Event, the same for changing. So that in the end the releatinship is correct maintained, even if the Object is not stored in the database.