eu tenho três tabelas no banco de dados: usuarios, permissoes e usuario_permissao. as tabelas representam um relacionamento @ManyToMany.
o problema é que eu quero excluir todos os registros da tabela usuario_permissao que fazem referência à um usuario qualquer para poder inserir as novas permissoes do usuario.
ou seja, sempre que eu vou inserir novas permissões para um usuário quero excluir as antigas antes.
tentei recuperar os elementos que quero excluir com a chamada do método usuario.getUsuarioPermissaoList() mas sempre dá erro no hibernate e se faço somente usuario.setUsuarioPermissaoList( novasPermissoesList ) ele só insere as novas permissoes e não apaga as antigas.
Cara eu uso a relaçao CASCADE DELETE ORPHAN, eu nao tenho o codigo aqui, mas segunda feira te posto ele, mas basicamente vc coloca uma relação na tabela “pai”, e outra relação na “filha”, q faz com ao deletar o “pai” a “filha” tbm eh deletada!
F
Flavio_Almeida
Para te ajudar, preciso ver o código das duas entidades envolvidas no relacionamento @ManyToMany.
Abraço
P
paulohrl
Cara
tenho esse tipo de relacionamento exaustivamente no projeto que estou trabalhando.
posta suas classes para dar uma olhada que te ajudamos.
abs
V
vitimnunes
beleza, lá vai o meu código das três classes representadas no relacionamento
packagebr.com.hibernateapp.bean;importjava.io.Serializable;importjava.util.List;importjavax.persistence.Basic;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.NamedQueries;importjavax.persistence.NamedQuery;importjavax.persistence.OneToMany;importjavax.persistence.OneToOne;importjavax.persistence.Table;importorg.hibernate.annotations.GenericGenerator;importorg.hibernate.annotations.Parameter;/** * Classe Usuario * * @author Victor Guimarães Nunes <code>[email removido]</code> * @since * @version */@Entity@Table(name="usuario")@NamedQueries({@NamedQuery(name="Usuario.findAll",query="SELECT u FROM Usuario u")})publicclassUsuarioimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@Basic(optional=false)@Column(name="IDUSUARIO")@GenericGenerator(name="generator",strategy="foreign",parameters={@Parameter(name="property",value="pessoa")})@GeneratedValue(generator="generator")privateStringidusuario;@Basic(optional=false)@Column(name="USUARIO")privateStringusuario;@Basic(optional=false)@Column(name="SENHA")privateStringsenha;@JoinColumn(name="IDUSUARIO",referencedColumnName="IDPESSOA",insertable=false,updatable=false)@OneToOne(optional=false)privatePessoapessoa;@OneToMany(cascade=CascadeType.ALL,mappedBy="usuario")privateList<Aluno>alunoList;@JoinColumn(name="ID_TIPO_USUARIO",referencedColumnName="ID_TIPO_USUARIO")@ManyToOne(optional=false)privateTipoUsuariotipoUsuario;@OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="usuario")privateList<UsuarioPermissao>usuarioPermissaoList;// Construtor, setters e getters}
packagebr.com.hibernateapp.bean;importjava.io.Serializable;importjava.util.List;importjavax.persistence.Basic;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.NamedQueries;importjavax.persistence.NamedQuery;importjavax.persistence.OneToMany;importjavax.persistence.Table;/** * Classe Permissao * * @author Victor Guimarães Nunes <code>[email removido]</code> * @since * @version */@Entity@Table(name="permissao")@NamedQueries({@NamedQuery(name="Permissao.findAll",query="SELECT p FROM Permissao p")})publicclassPermissaoimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Basic(optional=false)@Column(name="IDPERMISSAO")privateIntegeridpermissao;@Column(name="DESCRICAO")privateStringdescricao;@Column(name="URL")privateStringURL;@OneToMany(cascade=CascadeType.ALL,mappedBy="permissao")privateList<UsuarioPermissao>usuarioPermissaoList;// Construtor, setters e getters}
packagebr.com.hibernateapp.bean;importjava.io.Serializable;importjavax.persistence.Basic;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.ManyToOne;importjavax.persistence.NamedQueries;importjavax.persistence.NamedQuery;importjavax.persistence.Table;/** * Classe UsuarioPermissao * * @author Victor Guimarães Nunes <code>[email removido]</code> * @since * @version */@Entity@Table(name="usuario_permissao")@NamedQueries({@NamedQuery(name="UsuarioPermissao.findAll",query="SELECT u FROM UsuarioPermissao u")})publicclassUsuarioPermissaoimplementsSerializable{privatestaticfinallongserialVersionUID=1L;@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Basic(optional=false)@Column(name="IDUSUARIO_PERMISSAO")privateIntegeridusuarioPermissao;@JoinColumn(name="IDPERMISSAO",referencedColumnName="IDPERMISSAO")@ManyToOne(optional=false)privatePermissaopermissao;@JoinColumn(name="IDUSUARIO",referencedColumnName="IDUSUARIO")@ManyToOne(optional=false)privateUsuariousuario;// Construtor, setters e getters}
V
vitimnunes
realmente, já tentei de tudo e nada da certo… não consigo achar nada na web
P
Priuli
Bom, você não precisa criar uma classe UsuarioPermissao o hibernate cria para você através de anotação, não está funcionando como o paulohrl disse porque você não mapeou com a anotação @ManyToMany…
Olha como eu utilizo:
.. class Usuario {
@ManyToMany(fecht=FetchType.LAZY)
@JoinTable(name="USUARIO_PERMISSAO",
joinColumns={@JoinColumn(name="ID_USUARIO"},
inverseColumns={@JoinColumn(name="ID_PERMISSAO"}
private List<Permissao> permissaoList = new ArrayList<Permissao>();
}
.. class Permissao{
@ManyToMany(fecht=FetchType.LAZY, mappedBy="permissaoList ")
private List<Usuario> usuarioList = new ArrayList<Usuario>();
}
V
vitimnunes
Priuli:
Bom, você não precisa criar uma classe UsuarioPermissao o hibernate cria para você através de anotação, não está funcionando como o paulohrl disse porque você não mapeou com a anotação @ManyToMany..
Olha como eu utilizo:
.. class Usuario {
@ManyToMany(fecht=FetchType.LAZY)
@JoinTable(name="USUARIO_PERMISSAO",
joinColumns={@JoinColumn(name="ID_USUARIO"},
inverseColumns={@JoinColumn(name="ID_PERMISSAO"}
private List<Permissao> permissaoList = new ArrayList<Permissao>();
}
.. class Permissao{
@ManyToMany(fecht=FetchType.LAZY, mappedBy="permissaoList ")
private List<Usuario> usuarioList = new ArrayList<Usuario>();
}
o problema é que eu não posso mecher no banco de dados, daí eu tentei fazer como você disse e o seguinte erro apareceu:
ops… foi mal o post anterior, foi só uma desanteção que esqueci de modificar o ID_USUARIO por IDUSUARIO como funciona aqui na minha app…
valew mesmo, agora tá funfando certinho!