O que REFRESH e MERGE significam em termos de bancos de dados?

94

Estou curioso e preciso encontrar essa resposta rápida. O Google não vai ajudar muito.

A Java Persistence API tem essas propriedades que dizem ao framework para operações em cascata em entidades associadas:

CascadeType.PERSIST
CascadeType.DELETE
CascadeType.MERGE
CascadeType.REFRESH

Eu sei o que os dois primeiros significam: quando persisto o objeto A que tem B, persisto B também e quando excluo A, excluo B também.

Mas não consigo entender o que os outros dois realizam. Socorro?

André Chalella
fonte

Respostas:

80

REFRESH significa "puxar qualquer mudança de estado do banco de dados para minha representação". Cascatear isso é simples; isso significa que todas as entidades associadas são atualizadas.

MERGE significa algo complexo que se aproxima de "salvar", mas é mais como "colocar essa entidade separada de volta no status gerenciado e salvar suas alterações de estado"; o cascateamento significa que todas as entidades associadas são empurradas de volta da mesma maneira, e o identificador de entidade gerenciada de onde você recebe .merge()tem todas as entidades gerenciadas associadas a ele.

Link para uma instância dos documentos relevantes

caos
fonte
1
Qual é o padrão (se não definimos nenhum CascadeType) e o que é mais sensato / comum para definir?
Rosdi Kasim
@Rosdi Kasim: O CascadeTypepadrão é um array vazio.
user1438038
@chaos so refresh atualiza os filhos para corresponder ao que está no banco de dados quando o pai é atualizado / atualizado. Merge irá essencialmente sobrescrever campos atualizados nos filhos no banco de dados para refletir as entidades filhas com o pai. Portanto, se ambos forem usados, o que acontece? Eu imagino que não entendi isso.
Jordan Mackie
87

Significado da anotação JPA para relacionamentos muitos para muitos :

  • ALL - todas as operações em cascata possíveis executadas na entidade de origem são enviadas em cascata para o destino da associação.
  • MERGE - se a entidade de origem for mesclada, a mesclagem será enviada em cascata para o destino da associação.
  • PERSIST - se a entidade de origem é persistente, a persistência é enviada em cascata para o destino da associação.
  • REFRESH - se a entidade de origem for atualizada, a atualização será enviada em cascata ao destino da associação.
  • REMOVER - se a entidade de origem for removida, o destino da associação também será removido.

Eu mesmo os vejo desta forma (mais legível):

  • MERGE - para objetos existentes, para mesclar os dados existentes na tabela com os dados em meu objeto. (sincronizar com o banco de dados)
  • PERSIST - é criar novos registros do objeto no banco de dados.
  • REFRESH - é para atualizar os dados no objeto. Talvez tenha havido uma mudança no banco de dados que precisa ser sincronizada. (sincronizar do banco de dados)
  • REMOVER - é, bem, excluir.
cgp
fonte
1
O Javadoc para as anotações não esclareceu nada para mim. Obrigado pela resposta!
André Chalella