Hibernate não faz update em uma entidade realcionada

7 respostas
F

Bom dia !!

Estou com o seguinte problema : tenho uma classe usario que contem uma propriedade List quando eu salvo o usuario e ele funciona perfeitamente quando eu faço a exclusao tbm , porem quando eu tento fazer o update ele em não altera a tabela de usuario estabelecimento e sim adiciona mais estabelecimento… abaixo os fontes

@Entity
@Table(name="usuario")
@SequenceGenerator(name="id_usuario", sequenceName="id_usuario")
public class Usuario implements Serializable {
	

	
	private static final long serialVersionUID = 5130837767268165855L;
	
	private int id;
	private String nome;
	private String iniciais;
	private int acesso;
	private Collection<UsuarioEstabelecimento> estabelecimentos ;
	private String fone;
	private String celular;
	private String fax;
	private String email;
	
	
	@Id
	@Column (name="id")
	@GeneratedValue (strategy=GenerationType.SEQUENCE , generator="id_usuario")
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Column (name="nome", updatable=true)
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	@Column (name="acesso", updatable=true)
	public int getAcesso() {
		return acesso;
	}
	public void setAcesso(int acesso) {
		this.acesso = acesso;
	}
	@OneToMany(mappedBy="usuario", fetch = FetchType.EAGER)
	@Cascade(CascadeType.ALL)
	public Collection<UsuarioEstabelecimento> getEstabelecimentos() {
		return estabelecimentos;
	}
	public void setEstabelecimentos(Collection<UsuarioEstabelecimento> estabelecimentos) {
		this.estabelecimentos = estabelecimentos;
	}
	@Column (name="iniciais", updatable=true)
	public String getIniciais() {
		return iniciais;
	}
	public void setIniciais(String iniciais) {
		this.iniciais = iniciais;
	}
	@Column (name="fone", updatable=true)
	public String getFone() {
		return fone;
	}
	public void setFone(String fone) {
		this.fone = fone;
	}
	@Column (name="celular", updatable=true)
	public String getCelular() {
		return celular;
	}
	public void setCelular(String celular) {
		this.celular = celular;
	}
	@Column (name="fax", updatable=true)
	public String getFax() {
		return fax;
	}
	public void setFax(String fax) {
		this.fax = fax;
	}
	@Column (name="email", updatable=true)
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
}



@Entity
@Table(name="usuario_estabelecimento")
@SequenceGenerator(name="id_item_estab", sequenceName="id_item_estab")
public class UsuarioEstabelecimento implements Serializable {

	private static final long serialVersionUID  = 5130837767268165855L;
	private int id;
	private int idEstab;
	private Usuario usuario = new Usuario();
	private Estabelecimento estabelecimento = new Estabelecimento();
	
	@Id
	@Column (name="id")
	@GeneratedValue (strategy=GenerationType.SEQUENCE , generator="id_item_estab")
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="id_usuario",
	insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	@OneToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="id_estab",
	insertable=true, updatable=true)
	@Fetch(FetchMode.JOIN)
	public Estabelecimento getEstabelecimento() {
		return estabelecimento;
	}
	public void setEstabelecimento(Estabelecimento estabelecimento) {
		this.estabelecimento = estabelecimento;
	}
	
	
	
	
	
}


@Entity
@Table(name="estabelecimento" )
@SequenceGenerator(name="id_estab", sequenceName="id_estab")
public class Estabelecimento implements Serializable {
	 
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int id;
	private String descricao;
	private String idDBS;
	private String fone;
	private String codFaturamento;
	private String cnpj;
	private String nomeFaturamento;
	private String endereco;
	private String cidade;
	private String estado;
	private String cep;
	
	
	@Id
	@Column (name="id")
	@GeneratedValue (strategy=GenerationType.SEQUENCE , generator="id_estab")
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	@Column (name="descricao")
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	@Column (name="id_dbs")
	public String getIdDBS() {
		return idDBS;
	}
	public void setIdDBS(String idDBS) {
		this.idDBS = idDBS;
	}
	@Column (name="fone")	
	public String getFone() {
		return fone;
	}
	public void setFone(String fone) {
		this.fone = fone;
	}
	@Column (name="cod_faturamento")
	public String getCodFaturamento() {
		return codFaturamento;
	}
	public void setCodFaturamento(String codFaturamento) {
		this.codFaturamento = codFaturamento;
	}
	@Column (name="cnpj")
	public String getCnpj() {
		return cnpj;
	}
	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}
	@Column (name="nome_faturamento")
	public String getNomeFaturamento() {
		return nomeFaturamento;
	}
	public void setNomeFaturamento(String nomeFaturamento) {
		this.nomeFaturamento = nomeFaturamento;
	}
	@Column (name="endereco")
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	@Column (name="cidade")
	public String getCidade() {
		return cidade;
	}
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	@Column (name="estado")
	public String getEstado() {
		return estado;
	}
	public void setEstado(String estado) {
		this.estado = estado;
	}
	@Column (name="cep")
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}
	
}

// --------------


public class UsuarioDao {
	
	public void salvar(Usuario u){

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		// Salva Usuário
		session.save(u);
		// Flush, Commit da transação
		// close da sessão 
		session.getTransaction().commit();		
	}
	public void alterar(Usuario u){

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		// Salva Usuário
		session.update(u);
		// Flush, Commit da transação
		// close da sessão 
		session.getTransaction().commit();		
	}

	public List<Usuario> consultaItemUsuarioList(){
		//System.out.println("aqui");
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		// Seleciona-se os dados via HQL (hibernate query language)
		Query selectItemUsuario = session.createQuery("from Usuario");
		List<Usuario> usuarios = selectItemUsuario.list();
		session.getTransaction().commit();
		return usuarios;
	}
	
	
	
	
}

Eu tenho que apagar os estabelecimentos e inserir de novo ?

7 Respostas

alexterebinto

Estou com o mesmo problema. :cry:

Vinny

não sei se vc esta fazendo isso mas antes de vc fazer o update, vc tem que que carregar o usuario fazendo como eu mostrei a abaixo

Usuario user = (Usuario) sessao.get(Usuario.class, Codigo do usuario);

cola o código aqui só da parte da alteração pra fica mais facil identificar o problema.

F
public void alterar(Usuario u){

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		// Salva Usuário
		session.update(u);
		// Flush, Commit da transação
		// close da sessão 
		session.getTransaction().commit();		
	}

Eu uso o mapeamento as entidades no hibernete.cfg

<mapping class="com.br.model.Usuario"/> 
 <mapping class="com.br.model.UsuarioEstabelecimento"/> 
 <mapping class="com.br.model.Estabelecimento"/> 
...
ajinfotec

cara ponhe o cascateamento da coleção como REFRESH

@OneToMany(mappedBy="usuario", fetch = FetchType.EAGER, cascade = CascadeType.REFRESH)
F

não funciona… o

@Cascade(CascadeType.ALL)

ja contem esse tipo encapsulado

Vinny

A onde vc ta carregando o Usuario para a alteração?
cola aqui essa parte do código pq eu nao vi ela no código que vc posto aqui

nesse codigo abaixo, vc só deu o update mas da onde vem a variavel u?
onde vc ta carregando esse usuario?

public void alterar(Usuario u){

		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		// Salva Usuário
		session.update(u);
		// Flush, Commit da transação
		// close da sessão 
		session.getTransaction().commit();		
	}

O seu alterar esta correto, agora temos que ver a parte que vc carrega ele para fazer a alteração.

ajinfotec

mano seu problema conserteza o que Vinny ta ti dizendo.

Criado 3 de setembro de 2010
Ultima resposta 4 de set. de 2010
Respostas 7
Participantes 4