В чем разница между persist() и merge() в Hibernate?
в чем разница между persist() и merge() в Hibernate?
persist() можно создать запрос на обновление и вставку, например:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
в этом случае запрос будет генерироваться следующим образом:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
так persist() метод создать вставка и обновление.
теперь merge():
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
вот что я вижу в базе данных:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
теперь обновить запись используя merge()
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
вот что я вижу в базе данных:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
3 ответов:
спецификация JPA содержит очень точное описание семантики этих операций, лучше, чем в javadoc:
семантика остаются операции, применяемые к объекту х следующим образом:
если X-это новый объект, он становится управляемым. Предприятие Х будет вводится в базу данных одновременно или ранее фиксация транзакции или в результате прилив операция.
если X-это a уже существующий управляемый объект, это игнорируется сохраняются операции. Однако сохраняются операции расширена лиц, на которые ссылаются X, если отношения от X до этих другие объекты аннотируются с помощью
cascade=PERSISTилиcascade=ALLзначение элемента аннотации или указано с эквивалентным XML-дескриптором элемент.если X-удаленная сущность, это становится управляемый.
если X-это a отдельно стоящий объект,
EntityExistsExceptionможет быть брошен когда сохраняются операции вызывается, илиEntityExistsExceptionили еще одинPersistenceExceptionможет быть бросается на флеш или фиксацию времени.для все сущности Y, на которые ссылается a отношение от X, если отношение к Y было аннотировано со значением элемента каскада
cascade=PERSISTилиcascade=ALL, в продолжаются работы применяется к Я.
семантика слияние операции к сущности X применяются следующие значения:
если X является обособленным объектом, то состояние X копируется на уже существующий управляемый экземпляр сущности X ' того же самого удостоверение или новая управляемая копия X ' из X создаваемый.
если X-это новый объект экземпляр, новый управляемый объект создается экземпляр X' и состояние х копируется в новый управляемый экземпляр сущности X'.
если X-это a удалить экземпляр сущности,
IllegalArgumentExceptionбудет брошенный операцией слияния (или фиксация транзакции завершится неудачно).Если X является управляемым объектом, он игнорируется однако операция слияния операция слияния каскадируется в сущности, на которые ссылаются отношения от X, если эти отношения был аннотирован с каскадом элемент значение
cascade=MERGEилиcascade=ALLПримечание.для всех сущности Y, на которые ссылаются отношения из X, имеющего каскадный элемент значение
cascade=MERGEилиcascade=ALL, Y рекурсивно сливается как Y'. Для всех такой Y, на который ссылается X, X ' имеет значение справочник г'. (Обратите внимание, что если X потом X-это тот же самый объект как X'.)если X-это сущность, объединенная с X', со ссылкой на другую сущность г, где
cascade=MERGEилиcascade=ALLis не указано, то навигация по та же ассоциация из X ' дает a ссылка на управляемый объект Y' с помощью та же постоянная идентичность, что и Y.
это исходит от JPA. Очень простым способом:
persist(entity) должен использоваться с совершенно новыми сущностями, чтобы добавить их в БД (если сущность уже существует в БД, будет entityexistsexception throw).
слияние (сущность) должно использоваться, чтобы вернуть сущность в контекст сохранения, если сущность была отделена и была изменена.
Persist должен вызываться только для новых сущностей, в то время как слияние предназначено для повторного присоединения отсоединенных сущностей.
Если вы используете назначенный генератор,использование merge вместо persist может вызвать избыточную инструкцию SQL, что влияет на производительность.
и вызов слияния для управляемых объектов также является ошибкой, так как управляемые объекты автоматически управляются Hibernate и их состояние синхронизируется с записью базы данных элемент грязный механизм проверки на сброс контекста сохранения.
Comments