Problema em atualizar registro - Many-to-Many

1 resposta
Basilio

Prezados,

Estou desenvolvendo um sistema e é a primeira vez que uso o hibernate. Estou com um problema e peço a ajuda de vocês.
A questão é a seguinte:
Tenho as tabelas USUARIO, GRUPO (n pra n) e a de relacionamento. O problema é quando eu atualizo (update) algum dado na tabela de USUARIO (login, por exemplo) e o hibernate executa um delete na tabela de relacionamento, apagando os grupos que o usuario pertencia.
Andei pesquisando aqui no forum e na documentação do hibernate alguma referencia sobre isso mas não encontrei nada.

Classe Usuario:

@Entity
@Table(name="usuario"
    ,catalog="saunt"
)
public class Usuario  implements java.io.Serializable {

     private int idPessoa;
     private Pessoa pessoa;
     private String login;
     private String senha;
     private Set<Movimento> movimentos = new HashSet<Movimento>(0);
     private Set<Grupo> grupos = new HashSet<Grupo>(0);

    public Usuario() {
    }

    public Usuario(int idPessoa, Pessoa pessoa) {
        this.idPessoa = idPessoa;
        this.pessoa = pessoa;
    }
    public Usuario(int idPessoa, Pessoa pessoa, String login, String senha, Set<Movimento> movimentos, Set<Grupo> grupos) {
       this.idPessoa = idPessoa;
       this.pessoa = pessoa;
       this.login = login;
       this.senha = senha;
       this.movimentos = movimentos;
       this.grupos = grupos;
    }
   
     @Id 
    
    @Column(name="id_pessoa", unique=true, nullable=false)
    public int getIdPessoa() {
        return this.idPessoa;
    }
    
    public void setIdPessoa(int idPessoa) {
        this.idPessoa = idPessoa;
    }
@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="id_pessoa", unique=true, nullable=false, insertable=false, updatable=false)
    public Pessoa getPessoa() {
        return this.pessoa;
    }
    
    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
    
    @Column(name="login", length=45)
    public String getLogin() {
        return this.login;
    }
    
    public void setLogin(String login) {
        this.login = login;
    }
    
    @Column(name="senha", length=30)
    public String getSenha() {
        return this.senha;
    }
    
    public void setSenha(String senha) {
        this.senha = senha;
    }
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="usuario")
    public Set<Movimento> getMovimentos() {
        return this.movimentos;
    }
    
    public void setMovimentos(Set<Movimento> movimentos) {
        this.movimentos = movimentos;
    }
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinTable(name="grupo_usuario", catalog="saunt", joinColumns = { 
        @JoinColumn(name="id_usuario", nullable=false, updatable=false) }, inverseJoinColumns = { 
        @JoinColumn(name="id_grupo", nullable=false, updatable=false) })
    @OrderBy("nome")
        public Set<Grupo> getGrupos() {
            return this.grupos;
        }
    
    public void setGrupos(Set<Grupo> grupos) {
        this.grupos = grupos;
    }
}

Classe Grupo:

@Entity
@Table(name="grupo"
    ,catalog="saunt"
)
public class Grupo  implements java.io.Serializable {


     private Integer id;
     private String nome;
     private String descricao;
     private Set<Transacao> transacaos = new HashSet<Transacao>(0);
     private Set<Usuario> usuarios = new HashSet<Usuario>(0);

    public Grupo() {
    }

    public Grupo(String nome, String descricao, Set<Transacao> transacaos, Set<Usuario> usuarios) {
       this.nome = nome;
       this.descricao = descricao;
       this.transacaos = transacaos;
       this.usuarios = usuarios;
    }
   
     @Id @GeneratedValue(strategy=IDENTITY)
    
    @Column(name="id", unique=true, nullable=false)
    public Integer getId() {
        return this.id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    @Column(name="nome", length=45)
    public String getNome() {
        return this.nome;
    }
    
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    @Column(name="descricao")
    public String getDescricao() {
        return this.descricao;
    }
    
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinTable(name="grupo_transacao", catalog="saunt", joinColumns = { 
        @JoinColumn(name="id_grupo", nullable=false, updatable=false) }, inverseJoinColumns = { 
        @JoinColumn(name="id_transacao", nullable=false, updatable=false) })
    @OrderBy("nome")

    public Set<Transacao> getTransacaos() {
        return this.transacaos;
    }
    
    public void setTransacaos(Set<Transacao> transacaos) {
        this.transacaos = transacaos;
    }
@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    @JoinTable(name="grupo_usuario", catalog="saunt", joinColumns = {
        @JoinColumn(name="id_grupo", nullable=false, updatable=false) }, inverseJoinColumns = { 
        @JoinColumn(name="id_usuario", nullable=false, updatable=false) })
    public Set<Usuario> getUsuarios() {
        return this.usuarios;
    }
    
    public void setUsuarios(Set<Usuario> usuarios) {
        this.usuarios = usuarios;
    }
}

Sempre que atualizo algum registro (via código) no USUARIO o hibernate joga essa sql

delete
from
saunt.grupo_usuario
where
id_usuario=?

Gostaria, se possível, saber a causa disso e uma solução.

Obrigado.

1 Resposta

thiago.correa

No relacionamento de grupo com usuário coloca updatable como true

Criado 29 de março de 2010
Ultima resposta 29 de mar. de 2010
Respostas 1
Participantes 2