Qual é a diferença entre persist () e merge () no Hibernate?
persist()
pode criar uma consulta UPDATE & INSERT, por exemplo:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
neste caso, a consulta será gerada assim:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
portanto, o persist()
método pode gerar uma inserção e uma atualização.
Agora com merge()
:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Isso é o que vejo no banco de dados:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
Agora atualize um registro usando 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();
Isso é o que vejo no banco de dados:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
Respostas:
A especificação JPA contém uma descrição muito precisa da semântica dessas operações, melhor do que no javadoc:
fonte
persist
vsmerge
?Isso está vindo
JPA
. De uma forma muito simples:persist(entity)
deve ser usado com entidades totalmente novas, para adicioná-las ao BD (se a entidade já existe no BD haverá lançamento de EntityExistsException).merge(entity)
deve ser usado para colocar a entidade de volta no contexto de persistência se a entidade foi desanexada e foi alterada.fonte
Persist deve ser chamado apenas em novas entidades, enquanto merge serve para reconectar entidades desanexadas.
Se você estiver usando o gerador atribuído, usar merge em vez de persist pode causar uma instrução SQL redundante , afetando o desempenho.
Além disso, chamar merge para entidades gerenciadas também é um erro, pois as entidades gerenciadas são gerenciadas automaticamente pelo Hibernate e seu estado é sincronizado com o registro do banco de dados pelo mecanismo de verificação suja ao liberar o Contexto de Persistência .
fonte
A diferença mais importante é esta:
No caso de
persist
método, se a entidade a ser gerenciada no contexto de persistência já existe no contexto de persistência, a nova é ignorada. (Nada aconteceu)Mas no caso do
merge
método, a entidade que já é gerenciada no contexto de persistência será substituída pela nova entidade (atualizada) e uma cópia desta entidade atualizada retornará. (de agora em diante, todas as alterações devem ser feitas nesta entidade retornada se você quiser refletir suas alterações no contexto de persistência)fonte