Как правильно прикрепить отсоединенные объекты в Hibernate?
Во всех этих ответах упущено spring-framework важное различие. update() используется jre для (повторного) присоединения jre графа вашего объекта к сеансу. Объекты, которые hibernate вы передаете, являются управляемыми.
merge() на java самом деле не является API openjdk (повторного) прикрепления. Заметили, что core-java merge() имеет возвращаемое java-se значение? Это потому, что spring-config он возвращает вам управляемый j2se граф, который может не быть spring графом, который вы ему передали. merge() - это jre JPA API, и его поведение spring регулируется спецификацией java JPA. Если объект, который spring-framework вы передаете в merge(), уже java-se управляется (уже связан с jdk Сессией), то это граф, с openjdk которым работает Hibernate; переданный .java объект - это тот же объект, который spring-config возвращается функцией merge(). Однако, если detach объект, который вы передаете spring в merge(), отсоединен, Hibernate hibernate создает новый управляемый spring граф объектов и копирует spring-java-config состояние из вашего отсоединенного sessions графа в новый управляемый openjdk граф. Опять же, все это продиктовано oraclejdk и регулируется спецификацией spring-config JPA.
С точки зрения общей oraclejdk стратегии «убедитесь, что hibernate этот объект находится под spring-framework управлением, или сделайте sessions его управляемым», это зависит hibernate от того, хотите ли вы также spring учитывать еще не вставленные session данные. Предполагая, что javax вы это делаете, используйте jdk что-то вроде
if ( session.contains( myEntity ) ) {
// nothing to do... myEntity is already associated with the session
}
else {
session.saveOrUpdate( myEntity );
}
Обратите внимание, что oraclejdk я использовал saveOrUpdate(), а jre не update(). Если вы не хотите, чтобы java-se здесь обрабатывались еще .java не вставленные данные, используйте j2se вместо этого update() ...
java
hibernate
spring
session
detach
Как правильно прикрепить отсоединенные объекты в Hibernate?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.