Eclipselink merge не может сгенерировать оператор UPDATE для измененного значения - PullRequest
0 голосов
/ 08 февраля 2012

У меня есть 2 объединенных объекта, определенных следующим образом:

public class A {
    ...
    @Id
    @Column(name = "A_ID")
    @SequenceGenerator(...)
    @GeneratedValue(...)
    public Long getA_ID();

    @OneToOne(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL, targetEntity = B.class)
    public B getB();
    ...
}

@VirtualAccessMethods(get = "getMethod", set = "setMethod")
public class B {
    ...

    @Id
    public Long getA_ID();

    @MapsId
    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL ,targetEntity = A.class)
    @JoinColumn(name="A_ID")
    public A getA();

    getMethod(String name);

    setMethod(String name, Object value);
    ...
}

Когда я перехожу на em.merge(A) с B, присоединенным к A для INSERT, все работает нормально.Однако, если я сделаю то же самое для обновления, оно будет обновлять только A. Логика обновления выглядит следующим образом:

@Transactional
public void update(Object fieldOnANewValue, Object fieldOnBNewField) {
    A objA = em.executeQuery(...) //loads objA by primary key
    objA.setFieldOnA(fieldOnANewValue);
    B objB = objA.getB(); //lazy loads objB
    objB.setMethod("FieldOnB", fieldOnBNewValue);
}

Если я смотрю журналы, есть оператор SQL UPDATE, фиксирующийизменения, которые я сделал для A, но ничего для B. Если я вызову em.merge(objB) вручную, такая же проблема существует.Кто-нибудь знает точно, что EclipseLink делает, чтобы определить, следует ли генерировать оператор UPDATE?Особенно в отношении @VirtualAccessMethods?Тем не менее, раньше у меня были настройки сопоставлений @OneToOne по-другому, и em.merge(objB) тогда работал нормально, плюс INSERT работает, так что я не уверен, что это проблема.С другой стороны, если у меня есть другой объект, который также присоединен к A, но просто является обычным POJO, как A, для этого создается оператор UPDATE.Кэширование отключено, и я убедился, что объекты обновляются правильно перед вызовом слияния.

1 Ответ

3 голосов
/ 09 февраля 2012

Пожалуйста, покажите полный код и сопоставления.

Учитывая, что вы используете виртуальный доступ (вы используете это правильно?), Это может быть своего рода проблема отслеживания изменений, связанных с виртуальным доступом.Проблема возникает без использования виртуального доступа?

Попробуйте установить,

@ ChangeTracking (ChangeTrackingType.DEFERRED)

, чтобы проверить, влияет ли это.

Вы также можете попробовать,

@ InstantiationCopyPolicy

...