Org.hibernate.id.IdentifierGenerationException[RESOLVIDO]

15 respostas
E
org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): br.gov.cvm.rfe.dominio.corporativo.entidades.Uf

Pessoal sei que o erro diz que tenho que setar o id dessa entidade Uf manualmente porém eu tenho que setar esse objeto como null e no banco ele pode ser setado como null, mas na hora de salvar dar este erro, pq? Me ajudem por favor.

15 Respostas

A

na hora de criar seu objeto nao tem problema seu id seja null, desde que no seu banco dua PK seja incrementada de alguma forma, por exemplo, sequnce, auto incremente.

t+

E

Alisson deixa eu te explicar pra ver se vc me ajude, no BD minha tabela UF tem uma pk que se chama SG.
Eu tenho uma entidade que se chama AssociadoParticipante que possui essa foreing key SG que vem da tabela UF.
Porém na tabela AssociadoParticipante ela pode ser null e na hora de salvar da este erro, ou seja eu posso nao querer salvar uma UF quando for salvar um AssociadoParticipante entendeu?

O mapeamento esta assim

AssociadoParticipante:

@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
	@JoinColumn(name="SG_UF", nullable=true)
	public Uf getUf() {
		
		if(uf == null)
			uf = new Uf();
		
		return uf;
	}

UF:

@OneToMany(mappedBy="uf", fetch=FetchType.LAZY)
	public List<AssociacaoParticipante> getListAssocPartic() {
		return listAssocPartic;
	}
A

ate ai blz, porem na sua Tabela UF, sua PK SG, tem que ter uma forma de auto incremento, verifica se vc colocou isso.

E

Não tem nao a PK é a sigla da UF, exemplo “MG” - “SP” por ai vai.

G

O problema não está na AssociadoParticipante, está na propria UF.
O hibernate está tentando persistir a Uf, mas esta está com o id nulo. E como vc não mapeou o Id como valor gerado, então ele deve ser informado por você.

Se o problema está acontecendo quando vc insere o AssociadoParticipante, então ele deve estar fazendo um cascade pra inserir uma UF que está instanciada, mas com Id nulo. Dá uma olhada nisso.

E

Eu pensei que fosse isso tb, porém eu seto o UF pra null antes de persistir =/

G

Posta a sua classe UF.
Se eu fosse apostar, diria que em algum momento vc está mandando salvar uma Uf, ou está fazendo isso via cascade.

E

Então tem o cascade no AssociadoParticipante pra salvar a UF, mas ela pode ser null na tabela AssociadoParticipante:

Aqui esta UF:

package br.gov.cvm.rfe.dominio.corporativo.entidades;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="SIC_UF")
@NamedQueries({@NamedQuery(name="findUfByDescricao", query="Select uf from Uf uf where uf.sgUf = ?1"),
			   @NamedQuery(name="findUfByEndereco", query="Select uf from Uf uf left join fetch uf.listaMunicipios municipio where municipio.cdMunicipio = ?1")})
			   											
public class Uf implements Serializable {

	private static final long serialVersionUID = 1L;
	
	public static final String QUERY_CONSULTA_UF_PELA_DESCRICAO = "findUfByDescricao";
	
	public static final String QUERY_CONSULTA_UF_PELO_ENDERECO = "findUfByEndereco";
	
	private String sgUf;
	
	private String descricao;
	
	private List<Municipio> listaMunicipios;

	private List<AssociacaoParticipante> listAssocPartic;
	
	public void setSgUf(String sgUf) {
		this.sgUf = sgUf;
	}

	@Id
	@Column(name="SG_UF")
	public String getSgUf() {
		return sgUf;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	@Column(name="DS_UF")
	public String getDescricao() {
		return descricao;
	}

	public void setListaMunicipios(List<Municipio> listaMunicipios) {
		this.listaMunicipios = listaMunicipios;
	}

	@OneToMany(mappedBy="uf", fetch=FetchType.LAZY)
	public List<Municipio> getListaMunicipios() {
		return listaMunicipios;
	}
	

	@OneToMany(mappedBy="uf", fetch=FetchType.LAZY)
	public List<AssociacaoParticipante> getListAssocPartic() {
		return listAssocPartic;
	}

	public void setListAssocPartic(List<AssociacaoParticipante> listAssocPartic) {
		this.listAssocPartic = listAssocPartic;
	}
	
}

AssociacaoParticipante

/**
 * 
 */
package br.gov.cvm.rfe.dominio.corporativo.entidades;

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

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * @author rafaela.adriana
 *
 */
@Entity
@Table(name="SIC_ASSOC_PARTIC")
public class AssociacaoParticipante implements Serializable {

	private static final long serialVersionUID = 1L;

	private AssociacaoParticipantePk pk;
	
	private Long nrPfPjAssociado;
	
	private Date dtFimAssociacao;
	
	private String cdTpPfPjAssociado;
	
	private String nomeAssociado;
	
	private String logradouroAssociado;
	
	private String complementoAssociado;
	
	private String bairroAssociado;
	
	private Long cep;
	
	private String dddTelefoneAssociado;
	
	private Long nrTelefoneAssociado;
	
	private String dddFaxAssociado;
	
	private Long nrFaxAssociado;
	
	private String emailAssociado;
	
	private Municipio municipio;
	
	private Participante participante;
	
	private Uf uf;

	public void setPk(AssociacaoParticipantePk pk) {
		this.pk = pk;
	}

	@EmbeddedId
	public AssociacaoParticipantePk getPk() {
		if(pk == null)
			pk = new AssociacaoParticipantePk();
		return pk;
	}

	public void setNrPfPjAssociado(Long nrPfPjAssociado) {
		this.nrPfPjAssociado = nrPfPjAssociado;
	}

	@Column(name="NR_PF_PJ_ASSOC_PARTIC")
	public Long getNrPfPjAssociado() {
		return nrPfPjAssociado;
	}

	public void setDtFimAssociacao(Date dtFimAssociacao) {
		this.dtFimAssociacao = dtFimAssociacao;
	}
	
	@Temporal(TemporalType.TIMESTAMP)   
	@Column(name="DT_FIM_ASSOC_PARTIC", columnDefinition="smalldatetime")
	public Date getDtFimAssociacao() {
		return dtFimAssociacao;
	}

	public void setCdTpPfPjAssociado(String cdTpPfPjAssociado) {
		this.cdTpPfPjAssociado = cdTpPfPjAssociado;
	}

	@Column(name="CD_TP_PF_PJ_ASSOC_PARTIC")
	public String getCdTpPfPjAssociado() {
		return cdTpPfPjAssociado;
	}

	public void setNomeAssociado(String nomeAssociado) {
		this.nomeAssociado = nomeAssociado;
	}

	@Column(name="NM_ASSOC")
	public String getNomeAssociado() {
		return nomeAssociado;
	}

	public void setLogradouroAssociado(String logradouroAssociado) {
		this.logradouroAssociado = logradouroAssociado;
	}

	@Column(name="NM_ASSOC_LOGRAD")
	public String getLogradouroAssociado() {
		return logradouroAssociado;
	}

	public void setComplementoAssociado(String complementoAssociado) {
		this.complementoAssociado = complementoAssociado;
	}

	@Column(name="DS_ASSOC_COMPL")
	public String getComplementoAssociado() {
		return complementoAssociado;
	}

	public void setBairroAssociado(String bairroAssociado) {
		this.bairroAssociado = bairroAssociado;
	}

	@Column(name="NM_ASSOC_BAIRRO")
	public String getBairroAssociado() {
		return bairroAssociado;
	}

	public void setCep(Long cep) {
		this.cep = cep;
	}

	@Column(name="NR_ASSOC_CEP")
	public Long getCep() {
		return cep;
	}

	public void setNrTelefoneAssociado(Long nrTelefoneAssociado) {
		this.nrTelefoneAssociado = nrTelefoneAssociado;
	}

	@Column(name="NR_ASSOC_TEL1")
	public Long getNrTelefoneAssociado() {
		return nrTelefoneAssociado;
	}

	public void setDddTelefoneAssociado(String dddTelefoneAssociado) {
		this.dddTelefoneAssociado = dddTelefoneAssociado;
	}

	@Column(name="NR_ASSOC_DDD1")
	public String getDddTelefoneAssociado() {
		return dddTelefoneAssociado;
	}

	public void setDddFaxAssociado(String dddFaxAssociado) {
		this.dddFaxAssociado = dddFaxAssociado;
	}

	@Column(name="NR_ASSOC_DDD_FAX")
	public String getDddFaxAssociado() {
		return dddFaxAssociado;
	}

	public void setNrFaxAssociado(Long nrFaxAssociado) {
		this.nrFaxAssociado = nrFaxAssociado;
	}

	@Column(name="NR_ASSOC_FAX")
	public Long getNrFaxAssociado() {
		return nrFaxAssociado;
	}

	public void setEmailAssociado(String emailAssociado) {
		this.emailAssociado = emailAssociado;
	}

	@Column(name="NR_ASSOC_EMAIL")
	public String getEmailAssociado() {
		return emailAssociado;
	}

	public void setMunicipio(Municipio municipio) {
		this.municipio = municipio;
	}

	@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
	@JoinColumn(name="CD_MUN", nullable = true)
	public Municipio getMunicipio() {
		if(municipio == null){
			municipio = new Municipio();
		}
		return municipio;
	}

	public void setUf(Uf uf) {
		this.uf = uf;
	}

	@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL, optional=true)
	@JoinColumn(name="SG_UF", nullable=true)
	public Uf getUf() {		
		if(uf == null)
			uf = new Uf();		
		return uf;
	}

	public void setParticipante(Participante participante) {
		this.participante = participante;
	}

	@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
	@JoinColumns({
	@JoinColumn(name="CD_TP_PF_PJ",referencedColumnName="CD_TP_PF_PJ",insertable=false,updatable=false),
	@JoinColumn(name="NR_PF_PJ",referencedColumnName="NR_PF_PJ",insertable=false,updatable=false),
	@JoinColumn(name="CD_TP_PARTIC",referencedColumnName="CD_TP_PARTIC",insertable=false,updatable=false),
	@JoinColumn(name="DT_REG_PARTIC",referencedColumnName="DT_REG_PARTIC",insertable=false,updatable=false)
	})
	public Participante getParticipante() {
		return participante;
	}
}

metodo para persisitir

public void insere(){
		montaAssocPartic();
		participanteService.alterarParticipante(this.participante);
	}

nesse montaAssocPartic() eu seto uf pra null

E

Alguem me ajuda?

G

Confere no metodo insere(), se o this.participante.getUf() está realmente null. Imagino que esteja alguma UF lixo ali…

E

Guilherme ja conferi =/, veja so na imagem em anexo.

O unico objeto que tem UF tb nessa aplicaçao e Municipio porem Municipio tb esta null =/


G

Achei o problema ^^ Tava na nossa cara o tempo todo!

@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL, optional=true)  
@JoinColumn(name="SG_UF", nullable=true)  
public Uf getUf() {       
   if(uf == null)  
       uf = new Uf();        
    return uf;  
}

O Hibernate ta usando o getUf() que está criando uma UF na hora ali e ele tenta salvar. Logo, erro…

E

Pouts Guilherme é isso mesmo, mas pq o erro? Sendo que eu seto pra null? O hibernate sempre vai usar meus métodos getters e setters ou so esta usando pq fiz o mapeamento em cima deles?

G

Mesmo se você tivesse anotado a propriedade, o Hibernate vai pegar o valor dela através do método, principalmente por que (boas praticas dizem) sua propriedade será privada e o Hibernate não conseguirá receber o valor da variável (mesmo via Reflection), a não ser pelo getter dela.

Outro motivo disso é que o Hibernate permite que você tenha regras dentro do getter (o motivo de ser boa prática usar getters/setters) que sejam executadas antes de inserir o registro em banco de dados (ou de ser utilizado por qualquer outra coisa).

Então, não recomendo fazer esse tipo de inicialização. Se for pra evitar NPE em outros pontos do código, utilize um IF sempre que necessário.

Acho que respondi ^^

E

Pô Guilherme, muito obrigado cara :smiley:
Era pra evitar NPE mesmo kkk, mas vou mudar a implementação e utilizar os ifs hehe, valeuuuu!!!

Criado 14 de outubro de 2011
Ultima resposta 17 de out. de 2011
Respostas 15
Participantes 3