У меня есть база данных с двумя таблицами (на самом деле, но это не должно иметь значения в этом случае).У одного из них есть ссылка внешнего ключа на другой.Это могут быть сопоставления:
@Entity @Table public class A {
@Id public String id;
@Version public int version;
@OneToMany(targetEntity = B.class,
mappedBy = "a",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
public Collection<B> bs;
...
}
@Entity @Table public class B {
@Id public String id;
@Version public int version;
@ManyToOne(targetEntity = A.class,
cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
public A a;
...
}
У меня есть промежуточная структура данных, которая содержит информацию о взаимосвязи между A
и B
, которую я повторяю перед сохранением своих данных в активной транзакции, проверяяесли A
или B
уже существует в базе данных или не использует EntityManager.find(Class<T>, Object)
:
// get an entity manager and begin transaction
for (C c : cs) {
A a = em.find(A.class, c.getAId()); // an `A` doesn't exist in the database
if (null == a) { // on first iteration so a new one will
a = new A(); // be created
a.id = c.getAId(); // however in a 100 `C` there are 4-5
} // unique `A` exists
B b = em.find(B.class, c.getBId()); // a `B` generally doesn't exist in
if (null == b) { // the database, but the opposite
b = new B(); // could happen often
b.id = c.getBId();
b.a = a;
a.bs.add(b);
}
if (!em.contains(b)) // if a `B` was found in the database
em.persist(b); // persist won't execute here
}
// commit transaction
Это прекрасно работает: новые данные сохраняются, уже существующие вещи не.
Однако! Столбец версии в моей базе данных всегда обновляется независимо от того, что происходит в цикле for-each.Я взял набор образцов данных, сохранил их в своих пустых таблицах (версии были на 0);Я взял этот же набор образцов данных и сохранил его снова (EntityManager.persist(Object)
никогда не вызывался), а поля версии (в A
) были обновлены, но я не могу себе представить, почему.
Мне известен тот факт, что, хотя EntityManager.persist(Object)
никогда не вызывали, мой поставщик сохраняемости (Hibernate) генерировал операторы обновления для увеличения столбца версии.
Вопросы: почему?Как я могу предотвратить это?Что я должен изменить в моем методе сохранения моих данных, чтобы избежать этого?Спасибо.