Предварительное обновление EclipseLink для отношения OneToOne не сохраняется

У меня есть метод 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.

Как я могу решить эту проблему? Спасибо.


person taranaki    schedule 31.07.2019    source источник


Ответы (1)


JPA Spec утверждает, что:

Как правило, метод жизненного цикла переносимого приложения не должен вызывать EntityManager или операции запроса, получать доступ к другим экземплярам сущности или изменять отношения в одном и том же контексте сохраняемости. Метод обратного вызова жизненного цикла может изменить состояние отсутствия отношений объекта, для которого он вызывается.

Таким образом, простой ответ заключается в том, что прослушиватели сущностей не могут использоваться для этой задачи. Вместо этого реализуйте соответствующую логику на уровне обслуживания.

person crizzis    schedule 05.08.2019