JPA Problemas com Annotetion, @OneToOne, sessions.saveOrUpdate

4 respostas
Leandro_R_Combinato

Galera estou Problemas com Annotetion @OneToOne ao chamar sessions.saveOrUpdate(pessoa);
faz uma persistencia em varias tabelas Endereco, CadastroPessoa, ImpostosReter o meu problema é que quando vou alterar chamar o metodo sessions.saveOrUpdate(pessoa); novamente ele duplica a linha no banco de dados para essas tabelas Endereco, CadastroPessoa, ImpostosReter

Preciso resolver e compreender esse problema favorzaoo ajudem -me!

Codigo da Tabela PessoaF   abaixo tem relacionamento com as outras tabelas   Endereco, CadastroPessoa, ImpostosReter 



    sessions.saveOrUpdate(pessoa);
package br.com.locadeveloper.model;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.Transient;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;


@Entity  
@Table(name="PESSOAF")
public class PessoaF implements Serializable{
	
	
	public PessoaF(){
		endereco = new Endereco();
		cadastroPessoa = new CadastroPessoa();
		impostosReter = new ImpostosReter();
	}


	private static final long serialVersionUID = 1L;
	/** Identificador único pessoa*/
	private Long  mbId;
	private String mbTipoPessoa;
	private String mbCodReduzido;
	private String mbCodAlternativo;
	private String mbNomeCompleto;
	private Date mbDataNasc;
	private String mbSexo;
	private String mbRg;
	private String mbCpf;
	private Endereco endereco;
	private CadastroPessoa cadastroPessoa;
	private String mbPesqCodReduzido;
	private String mbPesqNome;
	private String mbPesqCPF;
	private String mbPesqRG;
	private SimpleDateFormat mascData; 
	private Date dataAtual;
	private ImpostosReter impostosReter;


	
	@Id  
	@GeneratedValue(strategy = GenerationType.AUTO) 
	@Column(name="ID")	
	public Long getMbId() {
		return mbId;
	}

	public void setMbId(Long mbId) {
		this.mbId = mbId;
	}
	@Column(name="TIPOPESSOA", nullable=false, length=11)	
	public String getMbTipoPessoa() {
		return mbTipoPessoa;
	}

	public void setMbTipoPessoa(String mbTipoPessoa) {
		this.mbTipoPessoa = mbTipoPessoa;
	}

	@Column(name="CODREDUZIDO", nullable=false, length=11) 
	public String getMbCodReduzido() {
		return mbCodReduzido;
	}

	public void setMbCodReduzido(String mbCodReduzido) {
		this.mbCodReduzido = mbCodReduzido;
	}
	@Column(name="CODALTERNATIVO", nullable=true, length=11) 	
	public String getMbCodAlternativo() {
		return mbCodAlternativo;
	}

	public void setMbCodAlternativo(String mbCodAlternativo) {
		this.mbCodAlternativo = mbCodAlternativo;
	}
	
	@Column(name="NOMECOMPLETO", nullable=false, length=200) 
	public String getMbNomeCompleto() {
		return mbNomeCompleto;
	}

	public void setMbNomeCompleto(String mbNomeCompleto) {
		this.mbNomeCompleto = mbNomeCompleto;
	}

	@Column(name="DATANASC", nullable=false, length=10) 
	@Temporal(javax.persistence.TemporalType.DATE)
	public Date getMbDataNasc() {
		return mbDataNasc;
	}

	public void setMbDataNasc(Date mbDataNasc) {
		this.mbDataNasc = mbDataNasc;
	}
	@Column(name="SEXO", nullable=false, length=1) 
	public String getMbSexo() {
		return mbSexo;
	}

	public void setMbSexo(String mbSexo) {
		this.mbSexo = mbSexo;
	}
	@Column(name="RG", nullable=false, length=20) 
	public String getMbRg() {
		return mbRg;
	}

	public void setMbRg(String mbRg) {
		this.mbRg = mbRg;
	}
	@Column(name="CPF", nullable=false, length=20) 
	public String getMbCpf() {
		return mbCpf;
	}

	public void setMbCpf(String mbCpf) {
		this.mbCpf = mbCpf;
	}
	@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	public CadastroPessoa getCadastroPessoa() {
		return cadastroPessoa;
	}

	public void setCadastroPessoa(CadastroPessoa cadastroPessoa) {
		this.cadastroPessoa = cadastroPessoa;
	}

	@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
	public ImpostosReter getImpostosReter() {
		return impostosReter;
	}

	public void setImpostosReter(ImpostosReter impostosReter) {
		this.impostosReter = impostosReter;
	}
	
	@Transient
	public String getMbPesqCodReduzido() {
		return mbPesqCodReduzido;
	}

	public void setMbPesqCodReduzido(String mbPesqCodReduzido) {
		this.mbPesqCodReduzido = mbPesqCodReduzido;
	}
	@Transient
	public String getMbPesqNome() {
		return mbPesqNome;
	}

	public void setMbPesqNome(String mbPesqNome) {
		this.mbPesqNome = mbPesqNome;
	}
	@Transient
	public String getMbPesqCPF() {
		return mbPesqCPF;
	}

	public void setMbPesqCPF(String mbPesqCPF) {
		this.mbPesqCPF = mbPesqCPF;
	}
	@Transient
	public String getMbPesqRG() {
		return mbPesqRG;
	}

	public void setMbPesqRG(String mbPesqRG) {
		this.mbPesqRG = mbPesqRG;
	}

	@Transient
	public SimpleDateFormat getMascData() {
		mascData = new SimpleDateFormat("##/##/####");
		
		return mascData;
	}

	public void setMascData(SimpleDateFormat mascData) {
		this.mascData = mascData;
	}
	@Transient
	public Date getDataAtual() {
		dataAtual = new Date();
		return dataAtual;
	}

	public void setDataAtual(Date dataAtual) {
		this.dataAtual = dataAtual;
	}

	public static long getSerialVersionUID() {
		return serialVersionUID;
	}


	public boolean equals(PessoaF pessoa) {
		return EqualsBuilder.reflectionEquals(this, pessoa);
	}

	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}

	public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
}

4 Respostas

arthurminarini

tente limpar a sessão antes (no inicio do metodo) com um getSession().clear();

arthurminarini

para cada classe que reprensenta uma Entity deve se implementar o equals e hashCode

Leandro_R_Combinato

Galera primeiramente agradecer a todos

Entao Pessoal consultei uns kra aki no meu MSN  e coloquei isso abaixo dentro pessoaf.jsf
<h:inputHidden value="#{pessoaFMB.pessoa.endereco.mbId}"/> 
 
 <h:inputHidden value="#{pessoaFMB.pessoa.cadastroPessoa.mbId}"/>

 <h:inputHidden value="#{pessoaFMB.pessoa.impostosReter.mbId}"/>

E agora esta funfun agora sem duplicar a linhas nas tabelas Endereco, CadastroPessoa, ImpostosReter

Espero ter ajudado outras pessoas tambem!

Valeu!

Leandro_R_Combinato
Pessoal Faltou um pequeno detalhe  Agora simm ta funfun
Query query = sessions.createQuery(" from PessoaJ " );


pessoa.getEndereco().setMbId(p.getEndereco().getMbId());
pessoa.getCadastroPessoa().setMbId(p.getCadastroPessoa().getMbId());
pessoa.getImpostosReter().setMbId(p.getImpostosReter().getMbId());

agora sim Galeraaaaaaaaaaaaaaa faltou só isso ! rs

Valeu !
Espero ter ajudado alguem!

Criado 18 de novembro de 2010
Ultima resposta 18 de nov. de 2010
Respostas 4
Participantes 2