Если у меня есть эти две сущности:JPA двунаправленной @OneToOne и каскад слияния
@Entity class A {
@OneToOne(cascade = CascadeType.MERGE, mappedBy = "a") B b;
//getters+setters
}
@Entity class B {
@OneToOne(cascade = CascadeType.MERGE) A a;
//getters+setters
}
ли JPA спецификация гарантия это?
A a = new A();
B b = new B();
a.setB(b);
b.setA(a);
A managedA = entityManager.merge(a);
// after commit, managedA will have a reference to a managed B which JPA implementation will link to managedA instead of original unmanaged A
Assert.assertTrue(managedA.getB().getA() == managedA);
Я понимаю, что он работает (по крайней мере, с последними EclipseLink, по крайней мере, иногда), но что спецификация не гарантирует, что.
Контрпримеры/спецификации выдержки приветствуются :-)
Сравнение == здесь специально. Я хочу точно знать, получаю ли я одну и ту же ссылку. equals() гарантируется спецификацией для этого случая. – ymajoros
3.2.7.1 из спецификации JPA 2 говорит следующее, что, по-видимому, указывает на то, что утверждения в моем вопросе будут гарантированы в конце концов. Как вы думаете? «Если X является сущностью, объединенной с X», с ссылкой на другой объект Y, где cascade = MERGE или cascade = ALL не указывается, тогда навигация по той же ассоциации из X 'дает ссылку на управляемый объект Y 'с тем же постоянным идентификатором, что и Y " – ymajoros
Хорошо, я получил вашу точку с оператором ==. Просто хотел указать на это, потому что многие люди смешивают это. И о вашей цитате: «... такая же стойкая идентичность, как и Y» -> постоянная идентичность! Это не идентичность объекта JVM. Вы не обязательно возвращаете тот же объект. Мой совет - всегда ожидать другого объекта. – bennidi