Utilizando Persist e Merge do entityManager

Em tese, poderia ser dito que os métodos persist e merge são responsáveis por fazerem insert e update de objetos na base de dados, no entanto esse métodos fazem muito mais que isso, eles também refletem no estado das entidades no contexto da aplicação.

Persist

Segundo a especificação, “Torna a instância managed e persiste”, ou seja, é criado uma instância do objeto no contexto e alterado seu estado para managed que irá implicar no insert no commit da transação.

Exemplo 1 – Persistindo cliente persist:

Cliente cliente = new Cliente();
cliente.setNome("José"); 

entityManager.persist(cliente); 

Será feito um insert do cliente com o nome “José” na base de dados.

Exemplo 2 – Alterado propriedades após a execução do persist:

Cliente cliente = new Cliente();

entityManager.persist(cliente); 
cliente.setNome("José"); 

O cliente será persistido como o nome “José” porque o persist torna a instância de cliente criado na linha 1 como managed e todas alterações feitas antes ou depois da chamada do entityManager.persist será refletida no banco de dados no commit da transação.

Observação: Caso seja usado o persist em uma entidade já existente será lançado a exceção EntityExistsException.

Merge

Segundo a especificação, “Mescla o estado da entidade recebida no atual contexto de persistência.”, ou seja, é criado uma nova instância do objeto e copiado o estado original da entidade e torna a nova instância como managed que irá implicar no insert no commit da transação

Exemplo 1 – Alterando propriedades da instância após execução do merge:

cliente.setNome("José"); 
entityManager.merge(cliente);

Será feito um update no cliente caso ele já exista, senão será feito um insert na tabela de cliente com o nome “José”.

Exemplo 2 – Alterando propriedades da instância após execução do merge:

entityManager.merge(cliente);
cliente.setNome("José"); 

A linha 2 não terá efeito no update porque a instância original não será marcada como managed, dessa forma, os dados só serão atualizados caso forem setados no objeto clientes antes da execução do merge.

Exemplo 3 – Alterando propriedades da instância copiada após execução do merge:

Cliente clienteParaAtualizar = entityManager.merge(cliente);
clienteParaAtualizar.setNome("José");  

Já no exemplo 3 a linha 2 terá efeito, porque o atributo setado é na cópia feita pelo merge, onde quando gerada é marcada como managed.

Observação: Os métodos persist e merge sempre que utilizados deverão estar dentro de uma transação senão será lançada a exceção TransactionRequiredException

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s