У меня есть метод PreUpdate, который выполняется, но при очистке entityManager изменения в зависимом объекте не сохраняются.
Ниже приведен мой минимальный (не) рабочий пример:
Объекты
@Entity
@Table(name = "HOUSE")
public class House {
@Id
@Column(name = "ID")
private long id;
@OneToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "INFO_ID")
private HouseInfo info;
@PreUpdate
protected void komplettiereEingabeWerte() {
info.setCode("TEST");
}
//getters and setters
}
@Entity
@Table(name = "HOUSE_INFO")
public class HouseInfo {
@Id
@Column(name = "ID")
private long id;
@Column(name = "CODE")
private String code;
//getters and setters
}
Тестовый пример
@Test
@Transactional(TransactionMode.ROLLBACK)
public void testPreUpdate() {
House house = entityManager.find(House.class, 1L);
house.setInfo(new HouseInfo());
entityManager.flush();
entityManager.clear();
house = entityManager.find(House.class, 1L);
assertEquals("TEST", house.getInfo().getCode());
}
Тест завершается неудачно из-за ошибки AssertionError в последней строке, поскольку код имеет значение null.
Я использую EclipseLink версии 2.7.4 с БД Oracle (такое же поведение наблюдалось и с БД Derby в памяти), и тест выполняется с UnitilsJUnit4 в SpringApplicationContext.
Как я могу решить эту проблему? Спасибо.