В чем разница между 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
917   3  

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=ALL is не указано, то навигация по та же ассоциация из X ' дает a ссылка на управляемый объект Y' с помощью та же постоянная идентичность, что и Y.

это исходит от JPA. Очень простым способом:

persist(entity) должен использоваться с совершенно новыми сущностями, чтобы добавить их в БД (если сущность уже существует в БД, будет entityexistsexception throw).

слияние (сущность) должно использоваться, чтобы вернуть сущность в контекст сохранения, если сущность была отделена и была изменена.

Persist должен вызываться только для новых сущностей, в то время как слияние предназначено для повторного присоединения отсоединенных сущностей.

Если вы используете назначенный генератор,использование merge вместо persist может вызвать избыточную инструкцию SQL, что влияет на производительность.

и вызов слияния для управляемых объектов также является ошибкой, так как управляемые объекты автоматически управляются Hibernate и их состояние синхронизируется с записью базы данных элемент грязный механизм проверки на сброс контекста сохранения.

Comments

    Ничего не найдено.