Compreendendo a diferença entre Persist() e Merge() no JPA e Hibernate
No JPA e Hibernate, persist() e merge () os métodos desempenham papéis críticos no gerenciamento de entidades e no tratamento da persistência de dados. No entanto, eles têm diferenças distintas em seus comportamentos.
Persist()
O método persist(), conforme definido pela especificação JPA, opera da seguinte forma:
- Se a entidade for nova e não gerenciada, ela se tornará gerenciada e será salva no banco de dados quando a transação for confirmada ou liberada.
- Se a entidade já for gerenciada ou removida, o a operação é ignorada.
- Se a entidade for desanexada, uma exceção poderá ser lançada ou a operação de persistência poderá falhar durante o tempo de liberação ou confirmação.
- As operações em cascata são aplicadas a quaisquer entidades referenciadas com cascade=PERSIST ou cascata=ALL annotations.
Merge()
Por outro lado, o método merge() tem um conjunto diferente de semântica:
- Se a entidade for desanexada, seu estado será copiado para uma entidade gerenciada pré-existente com a mesma identidade ou uma nova cópia gerenciada será criada.
- Se a entidade for nova , uma nova entidade gerenciada é criada e seu estado é copiado da entidade de entrada.
- Se a entidade for removida, uma exceção será lançada.
- Se a entidade for gerenciada, a operação será ignorada , mas as operações em cascata ainda serão aplicadas a entidades referenciadas se anotadas com cascade=MERGE ou cascade=ALL.
- A entidade mesclada faz referência às entidades gerenciadas para todos os relacionamentos anotados com cascade=MERGE ou cascade=ALL.
- Se uma entidade for mesclada com uma referência a um relacionamento não em cascata, a associação da entidade mesclada retornará uma referência a um objeto gerenciado com a mesma identidade.
Quando para usar Persist() ou Merge()
Com base nessas diferenças, as diretrizes a seguir podem ajudá-lo a escolher o método apropriado:
- Use persist() quando quiser para criar uma nova ou atualizar uma entidade existente que ainda não é gerenciada pelo contexto de persistência.
- Use merge() quando quiser atualizar uma entidade existente que já é gerenciada, mas foi modificada fora do contexto de persistência .