Hibernate não faz update em tabela

4 respostas
caiofabioa

Esta é minha classe:

package br.com.caioaraujo.sige.model.mapping;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Type;

import br.com.caioaraujo.sige.control.impl.utils.IAtivo;

@Entity
public class Membro implements IAtivo{
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private Integer idMembro;
	
	@Lob
	private byte[] foto;
	
	@Column
	private Boolean ativo;
	
	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="idPessoaFisica")
	private PessoaFisica dadosPessoa;
	
	@Column(length=50)
	private String nomePai;
	
	@Column(length=50)
	private String nomeMae;
	
	@OneToOne
	private Cidade cidadeNascimento;
	
	@Temporal(TemporalType.DATE)
	private Date dataCasamento;
	
	@Column
	private String conjuge;
	
	@Column(length=2)
	private Integer qtdeFilhos;
	
	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="idMembroHistorico")
	private MembroHistorico membresia;

	public boolean isAtivo() {
		return ativo;
	}

	public Integer getIdMembro() {
		return idMembro;
	}

	public byte[] getFoto() {
		return foto;
	}

	public PessoaFisica getDadosPessoa() {
		return dadosPessoa;
	}

	public String getNomePai() {
		return nomePai;
	}

	public String getNomeMae() {
		return nomeMae;
	}

	public Cidade getCidadeNascimento() {
		return cidadeNascimento;
	}

	public Date getDataCasamento() {
		return dataCasamento;
	}

	public String getConjuge() {
		return conjuge;
	}

	public Integer getQtdeFilhos() {
		return qtdeFilhos;
	}

	public MembroHistorico getMembresia() {
		return membresia;
	}

	public void setIdMembro(Integer idMembro) {
		this.idMembro = idMembro;
	}

	public void setFoto(byte[] foto) {
		this.foto = foto;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	public void setDadosPessoa(PessoaFisica dadosPessoa) {
		this.dadosPessoa = dadosPessoa;
	}

	public void setNomePai(String nomePai) {
		this.nomePai = nomePai;
	}

	public void setNomeMae(String nomeMae) {
		this.nomeMae = nomeMae;
	}

	public void setCidadeNascimento(Cidade cidadeNascimento) {
		this.cidadeNascimento = cidadeNascimento;
	}

	public void setDataCasamento(Date dataCasamento) {
		this.dataCasamento = dataCasamento;
	}

	public void setConjuge(String conjuge) {
		this.conjuge = conjuge;
	}

	public void setQtdeFilhos(Integer qtdeFilhos) {
		this.qtdeFilhos = qtdeFilhos;
	}

	public void setMembresia(MembroHistorico membresia) {
		this.membresia = membresia;
	}
	
}

Este é o meu dao

public void update(Membro membro)
	{
		sf = HibernateUtil.getSessionFactory();
		s = sf.openSession();
		try{
			s.beginTransaction();
			s.saveOrUpdate(membro);
			s.getTransaction().commit();
		}catch(Exception e){
			// vsf
		}
		
	}

e este é o objeto a ser atualizado no banco
[img]
https://www.dropbox.com/s/rbcwteztpp15uu7/object.jpg
[/img]

Porém ao invés de fazer update ele faz insert e da um erro por ter um campo unique

Hibernate: 
    insert 
    into
        sige.PessoaFisicaLocal
        (bairro, cep, cidade_idCidade, complemento, email, numero, rua) 
    values
        (?, ?, ?, ?, ?, ?, ?)
Hibernate: 
    insert 
    into
        sige.TelefonePessoa
        (telefoneCelular, telefoneComercial, telefoneResidencial) 
    values
        (?, ?, ?)
Hibernate: 
    insert 
    into
        sige.PessoaFisica
        (cpf, dataNascimento, idPessoaFisicaLocal, estadoCivil, nomeCompleto, rg, sexo, idPessoaTelefone) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?)
WARN   - {2013-12-31 10:53:09,278} [AWT-EventQueue-0] org.hibernate.engine.jdbc.spi.SqlExceptionHelper(logExceptions:143) - SQL Error: 1062, SQLState: 23000
 ERROR  - {2013-12-31 10:53:09,279} [AWT-EventQueue-0] org.hibernate.engine.jdbc.spi.SqlExceptionHelper(logExceptions:144) - Duplicate entry '[CPF removido]' for key 'cpf'

ja tente saveOrUpdate(object), merge(object) e persist(object) e nenhuma da..

Ah, e em meu xml está configurado como update

<hibernate-configuration>
 <session-factory>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sige</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password"></property>
  <property name="hibernate.default_schema">sige</property>
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>  
  <property name="hibernate.hbm2ddl.auto">update</property> 
  <property name="hibernate.show_sql">true</property>  
  <property name="hibernate.format_sql">true</property>  
  <property name="hibernate.query.substitutions">true 1, false 0</property>
  <mapping class="br.com.caioaraujo.sige.model.mapping.Usuario"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.UsuarioPerfilAcesso"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.Estado"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.Pais"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.Cidade"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.MembroDesligamento"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.MembroHistorico"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.TelefonePessoa"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.PessoaFisicaLocal"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.PessoaFisica"/>
  <mapping class="br.com.caioaraujo.sige.model.mapping.Membro"/>
 </session-factory>
</hibernate-configuration>

4 Respostas

RodrigoKaos

[i]O campo relativo ao cpf é unico, então é só passar um cpf valido :smiley:

E como vc n settou nenhum idMembro ao objeto, o hibernate gera um novo id para inserir, mas não consegue por que esse cpf já esta em uso.

Boa sorte ae[/i]

caiofabioa

O Campo CPF esta correto pois é um update, e como disse no escopo esta indo o id do membro, porem o hibernate nao faz update!

RodrigoKaos

Então usa o método update e vê qual a exceção

R

Você já deve ter inserido o valor ‘[CPF removido]’ em algum registro na tabela. O unique não vai permitir inseri-lo novamente. Nem o valor null pode ser duplicado no unique simples. Veja se é isto.

Criado 31 de dezembro de 2013
Ultima resposta 10 de mar. de 2014
Respostas 4
Participantes 3