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