To tendo problemas ao usar o metodo merge no JPA. Quando tenho um relacionamento one-many ou many-many quando adiciona um objeto na coleção de uma das classe o merge adiciona na tabela o resgistro normalmente, mas no caso de remoção de um dos items da coleção o merge não remove na tabela do banco. Gostaria da ajuda de vocês.
Quando você fala “problemas” significa exceção, ou o quê? Dê mais informações que possam nos ajudar a te ajudar, ok? Tipo, trechos de códigos (usando as tags do JForum) que supostamente você acha que podem está errados, como anotou a classe que está com problemas, se gerou execeção pode colocar ela ai para nós vermos, essas coisas…
Nenhuma exceção e gerada.
@Entity
public class Usuario implements Serializable {
@Id
private String usuario;
private String senha;
private String nome;
private String email;
@Lob
private byte[] foto;
@ManyToMany(mappedBy = "usuarioCollection", cascade = CascadeType.MERGE)
private Collection<Grupo> grupoCollection;
//get, set e outros metodos
}
@Entity
public class Grupo implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
private String descricao;
@JoinTable(name = "USUARIO_GRUPO", joinColumns = {@JoinColumn(name = "GRUPO", referencedColumnName = "ID")}, inverseJoinColumns = {@JoinColumn(name = "USUARIO", referencedColumnName = "USUARIO")})
@ManyToMany (cascade=CascadeType.ALL)
private Collection<Usuario> usuarioCollection;
//gets, sets e outros metodos
}
Após remover um grupo de um usuario executo o seguinte codigo:
entityManager.getTransaction().begin();
entityManager.merge(usuario);
getTransaction().commit();
Mesmo após o codigo acima no banco nada acontece e ao examinar o log não encontro nenhuma instrução de delete. Mas o mesmo codigo citado acima quando adiciono um novo grupo ao usuário modifica o banco inserindo um novo registro na tabela com o relacionamento e no log consigo ver que ele gera um insert.
Tow usando o toplink.
foi mal o , na proxima acerto.
Opa, beleza!!É só editar o seu código, e ao invés de colocar “<>” coloque “[]”! !
Você quer atualizar com o merge?
exato
Não confia em merge não. E eu te digo uma coisa: MERGE não é UPDATE!
Quando você quer atualizar algo é só pegar um objeto gerenciado pelo container JPA, e alterar suas propriedades com os setters. Quando der um commit, as alterações terão sido enviadas à base de dados.
[quote=Leonardo3001]Não confia em merge não. E eu te digo uma coisa: MERGE não é UPDATE!
Quando você quer atualizar algo é só pegar um objeto gerenciado pelo container JPA, e alterar suas propriedades com os setters. Quando der um commit, as alterações terão sido enviadas à base de dados.[/quote]
Eu sei que o merge não é update, do mesmo jeito que persist não é insert. O merge torna uma entidade desacoplada em gerencialvel e faz com que as diferenças sejam alteradas no banco. Só que quando removo de minha entidade um objeto que está em uma coleção não acontece nada no banco.
Acredito que meu problema seja parecido com este: