Hibernate: org.hibernate.ObjectNotFoundException

9 respostas
maniacs

A seguinte exception retorna se faço um session.get/session.load

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.ibs.model.Cliente#1212]

o estranho é que deveria retornar null ja que tal cliente não existe …
se faço session.createCriteria e Expression.eq(field, value) ele retonar null

Exception completa:

Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.ibs.model.Cliente#1212]
        at org.hibernate.impl.SessionFactoryImpl$1.handleEntityNotFound(SessionFactoryImpl.java:377)
        at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:79)
        at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:68)
        at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
        at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
        at com.ibs.model.Cliente$$EnhancerByCGLIB$$c954156f.toString(<generated>)
        at java.lang.String.valueOf(String.java:2827)
        at java.io.PrintStream.println(PrintStream.java:771)
        at hibernate.Main.main(Main.java:39)
Java Result: 1

9 Respostas

digaum

A exceção diz que nao existe linha com o identificador que você passou!

De uma olhada nisso…

normandesjr

Posta sua classe de como você está fazendo o session.get/load.

maniacs

Usando GenericHibernate:

@SuppressWarnings("unchecked")
    public T getByID(ID id) {
	return (T) getSession().load(getPersistentClass(), id);
    }

Cliente:

/*
 * Cliente.java
 *
 * Criado em: 17 de Outubro de 2007, 14:04
 */

package com.ibs.model;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 * @author Yuri Ruano do Nascimento
 *
 * @description
 *  CPFCNPJ             CHAR(14) NOT NULL,
 *  CD_ESTADO           CHAR(2) NOT NULL,
 *  CD_CIDADE           INTEGER NOT NULL,
 *  CD_ESTCIVIL         INTEGER NOT NULL,
 *  NM_CLIENTE          VARCHAR(60),
 *  NR_RG               CHAR(10),
 *  DT_NASCIMENTO       DATE,
 *  FG_PESSOA           CHAR(1),
 *  DS_ENDERECO         VARCHAR(80),
 *  NR_NUMERO           CHAR(6),
 *  DS_BAIRRO           VARCHAR(50),
 *  DS_COMPLEMENTO      VARCHAR(70),
 *  NR_IE               CHAR(15),
 *  NM_CONJUGE          VARCHAR(70),
 *  DS_NASC_CONJUGE     DATE,
 *  NM_PAI              VARCHAR(70),
 *  NM_MAE              VARCHAR(70),
 *  DS_NATURALIDADE     VARCHAR(50),
 *  DS_INSTRUCAO        VARCHAR(50),
 *  DS_TRABALHO         VARCHAR(50),
 *  NR_FONE_TRABALHO    CHAR(15),
 *  NR_FONE_CEL         CHAR(15),
 *  NR_FONE_RESIDENCIA  CHAR(15),
 *  BL_OBS              BLOB SUB_TYPE 1 SEGMENT SIZE 80,
 *  VL_LIMITE           NUMERIC(12,2),
 *  DT_LIMITE           DATE,
 *  FG_BLOQUEADO        SMALLINT,
 *  CD_MOTIVO_BLOQUEIO  INTEGER,
 *  FG_ATIVO            SMALLINT NOT NULL,
 *  DT_CAD              DATE NOT NULL,
 *  HR_CAD              TIME NOT NULL,
 *  DT_ALT              DATE NOT NULL,
 *  HR_ALT              TIME NOT NULL,
 *  CD_USUARIO          VARCHAR(20) NOT NULL
 */

@Entity
@Table(name="CLIENTE")
public class Cliente implements java.io.Serializable {
    
    @Id
    @Column(name="CPFCNPJ", unique=true, length=14, nullable=false)
    private String CPFCNPJ;
    
    @Column(name="CD_ESTADO", length=2, nullable=false)
    private String CD_ESTADO;
    
    @Column(name="CD_ESTCIVIL", length=9, nullable=false)
    private Integer CD_ESTCIVIL;
    
    @Column(name="CD_CIDADE", length=9, nullable=false)
    private Integer CD_CIDADE;
    
    @Column(name="NM_CLIENTE", length=60)
    private String NM_CLIENTE;
    
    @Column(name="NR_RG", length=10)
    private String NR_RG;
    
    @Temporal(value = TemporalType.DATE)
    @Column(name="DT_NASCIMENTO")
    private Date DT_NASCIMENTO;
    
    @Column(name="FG_PESSOA", length=1)
    private String FG_PESSOA;
    
    @Column(name="DS_ENDERECO", length=80)
    private String DS_ENDERECO;
    
    @Column(name="NR_NUMERO", length=6)
    private String NR_NUMERO;
    
    @Column(name="DS_BAIRRO", length=50)
    private String DS_BAIRRO;
    
    @Column(name="DS_COMPLEMENTO", length=70)
    private String DS_COMPLEMENTO;
    
    @Column(name="NR_IE", length=15)
    private String NR_IE;
    
    @Column(name="NM_CONJUGE", length=70)
    private String NM_CONJUGE;
    
    @Temporal(value = TemporalType.DATE)
    @Column(name="DT_NASC_CONJUGE")
    private Date DT_NASC_CONJUGE;
    
    @Column(name="NM_PAI", length=70)
    private String NM_PAI;
    
    @Column(name="NM_MAE", length=70)
    private String NM_MAE;
    
    @Column(name="DS_NATURALIDADE", length=50)
    private String DS_NATURALIDADE;
    
    @Column(name="DS_INSTRUCAO", length=50)
    private String DS_INSTRUCAO;
    
    @Column(name="DS_TRABALHO", length=50)
    private String DS_TRABALHO;
    
    @Column(name="NR_FONE_TRABALHO", length=15)
    private String NR_FONE_TRABALHO;
    
    @Column(name="NR_FONE_CEL", length=15)
    private String NR_FONE_CEL;
    
    @Column(name="NR_FONE_RESIDENCIA", length=15)
    private String NR_FONE_RESIDENCIA;
    
    @Column(name="BL_OBS")
    private String BL_OBS;
    
    @Column(name="VL_LIMITE", length=12)
    private BigDecimal VL_LIMITE;
    
    @Temporal(value = TemporalType.DATE)
    @Column(name="DT_LIMITE")
    private Date DT_LIMITE;
    
    @Column(name="FG_BLOQUEADO",length=2)
    private Integer FG_BLOQUEADO;
    
    @Column(name="CD_MOTIVO_BLOQUEIO")
    private Integer CD_MOTIVO_BLOQUEIO;
    
    @Column(name="FG_ATIVO", nullable=false)
    private Integer FG_ATIVO;
    
    @Temporal(value = TemporalType.DATE)
    @Column(name="DT_CAD")
    private Date DT_CAD;
    
    @Temporal(value = TemporalType.TIME)
    @Column(name="HR_CAD")
    private Date HR_CAD;
    
    @Temporal(value = TemporalType.DATE)
    @Column(name="DT_ALT")
    private Date DT_ALT;
    
    @Temporal(value = TemporalType.TIME)
    @Column(name="HR_ALT")
    private Date HR_ALT;
    
    @Column(name="CD_USUARIO")
    private String CD_USUARIO;

    
    /** Cria nova instancia de Cliente */
    public Cliente() {
    }
    
    public Cliente(String CPFCNPJ){
	this.CPFCNPJ = CPFCNPJ;
    }
    
    public void setCPFCNPJ(String CPFCNPJ) {
	this.CPFCNPJ = CPFCNPJ;
    }
    
    public String getCPFCNPJ() {
	return CPFCNPJ;
    }
    
    public void setCD_ESTADO(String CD_ESTADO) {
	this.CD_ESTADO = CD_ESTADO;
    }
    
    public String getCD_ESTADO() {
	return CD_ESTADO;
    }
    
    public void setCD_ESTCIVIL(Integer CD_ESTCIVIL) {
	this.CD_ESTCIVIL = CD_ESTCIVIL;
    }
    
    public int getCD_ESTCIVIL() {
	return CD_ESTCIVIL;
    }
    
    public void setCD_CIDADE(Integer CD_CIDADE) {
	this.CD_CIDADE = CD_CIDADE;
    }
    
    public int getCD_CIDADE() {
	return CD_CIDADE;
    }
    
    public void setNM_CLIENTE(String NM_CLIENTE) {
	this.NM_CLIENTE = NM_CLIENTE;
    }
    
    public String getNM_CLIENTE() {
	return NM_CLIENTE;
    }
    
    public void setNR_RG(String NR_RG) {
	this.NR_RG = NR_RG;
    }
    
    public String getNR_RG() {
	return NR_RG;
    }
    
    public void setDT_NASCIMENTO(Date DT_NASCIMENTO) {
	this.DT_NASCIMENTO = DT_NASCIMENTO;
    }
    
    public Date getDT_NASCIMENTO() {
	return DT_NASCIMENTO;
    }
    
    public void setFG_PESSOA(String FG_PESSOA) {
	this.FG_PESSOA = FG_PESSOA;
    }
    
    public String getFG_PESSOA() {
	return FG_PESSOA;
    }
    
    public void setDS_ENDERECO(String DS_ENDERECO) {
	this.DS_ENDERECO = DS_ENDERECO;
    }
    
    public String getDS_ENDERECO() {
	return DS_ENDERECO;
    }
    
    public void setNR_NUMERO(String NR_NUMERO) {
	this.NR_NUMERO = NR_NUMERO;
    }
    
    public String getNR_NUMERO() {
	return NR_NUMERO;
    }
    
    public void setDS_BAIRRO(String DS_BAIRRO) {
	this.DS_BAIRRO = DS_BAIRRO;
    }
    
    public String getDS_BAIRRO() {
	return DS_BAIRRO;
    }
    
    public void setDS_COMPLEMENTO(String DS_COMPLEMENTO) {
	this.DS_COMPLEMENTO = DS_COMPLEMENTO;
    }
    
    public String getDS_COMPLEMENTO() {
	return DS_COMPLEMENTO;
    }
    
    public void setNR_IE(String NR_IE) {
	this.NR_IE = NR_IE;
    }
    
    public String getNR_IE() {
	return NR_IE;
    }
    
    public void setNM_CONJUGE(String NM_CONJUGE) {
	this.NM_CONJUGE = NM_CONJUGE;
    }
    
    public String getNM_CONJUGE() {
	return NM_CONJUGE;
    }
    
    public void setDT_NASC_CONJUGE(Date DT_NASC_CONJUGE) {
	this.DT_NASC_CONJUGE = DT_NASC_CONJUGE;
    }
    
    public Date getDT_NASC_CONJUGE() {
	return DT_NASC_CONJUGE;
    }
    
    public void setNM_PAI(String NM_PAI) {
	this.NM_PAI = NM_PAI;
    }
    
    public String getNM_PAI() {
	return NM_PAI;
    }
    
    public void setNM_MAE(String NM_MAE) {
	this.NM_MAE = NM_MAE;
    }
    
    public String getNM_MAE() {
	return NM_MAE;
    }
    
    public void setDS_NATURALIDADE(String DS_NATURALIDADE) {
	this.DS_NATURALIDADE = DS_NATURALIDADE;
    }
    
    public String getDS_NATURALIDADE() {
	return DS_NATURALIDADE;
    }
    
    public void setDS_INSTRUCAO(String DS_INSTRUCAO) {
	this.DS_INSTRUCAO = DS_INSTRUCAO;
    }
    
    public String getDS_INSTRUCAO() {
	return DS_INSTRUCAO;
    }
    
    public void setDS_TRABALHO(String DS_TRABALHO) {
	this.DS_TRABALHO = DS_TRABALHO;
    }
    
    public String getDS_TRABALHO() {
	return DS_TRABALHO;
    }
    
    public void setNR_FONE_TRABALHO(String NR_FONE_TRABALHO) {
	this.NR_FONE_TRABALHO = NR_FONE_TRABALHO;
    }
    
    public String getNR_FONE_TRABALHO() {
	return NR_FONE_TRABALHO;
    }
    
    public void setNR_FONE_CEL(String NR_FONE_CEL) {
	this.NR_FONE_CEL = NR_FONE_CEL;
    }
    
    public String getNR_FONE_CEL() {
	return NR_FONE_CEL;
    }
    
    public void setNR_FONE_RESIDENCIA(String NR_FONE_RESIDENCIA) {
	this.NR_FONE_RESIDENCIA = NR_FONE_RESIDENCIA;
    }
    
    public String getNR_FONE_RESIDENCIA() {
	return NR_FONE_RESIDENCIA;
    }
    
    public void setBL_OBS(String BL_OBS) {
	this.BL_OBS = BL_OBS;
    }
    
    public String getBL_OBS() {
	return BL_OBS;
    }
    
    public void setVL_LIMITE(BigDecimal VL_LIMITE) {
	this.VL_LIMITE = VL_LIMITE;
    }
    
    public BigDecimal getVL_LIMITE() {
	return VL_LIMITE;
    }
    
    public void setDT_LIMITE(Date DT_LIMITE) {
	this.DT_LIMITE = DT_LIMITE;
    }
    
    public Date getDT_LIMITE() {
	return DT_LIMITE;
    }
    
    public void setFG_BLOQUEADO(Integer FG_BLOQUEADO) {
	this.FG_BLOQUEADO = FG_BLOQUEADO;
    }
    
    public int getFG_BLOQUEADO() {
	return FG_BLOQUEADO;
    }
    
    public void setCD_MOTIVO_BLOQUEIO(Integer CD_MOTIVO_BLOQUEIO) {
	this.CD_MOTIVO_BLOQUEIO = CD_MOTIVO_BLOQUEIO;
    }
    
    public int getCD_MOTIVO_BLOQUEIO() {
	return CD_MOTIVO_BLOQUEIO;
    }
    
    public void setDT_CAD(Date DT_CAD) {
	this.DT_CAD = DT_CAD;
    }
    
    public Date getDT_CAD() {
	return DT_CAD;
    }
    
    public void setHR_CAD(Date HR_CAD) {
	this.HR_CAD = HR_CAD;
    }
    
    public Date getHR_CAD() {
	return HR_CAD;
    }
    
    public void setDT_ALT(Date DT_ALT) {
	this.DT_ALT = DT_ALT;
    }
    
    public Date getDT_ALT() {
	return DT_ALT;
    }
    
    public void setHR_ALT(Date HR_ALT) {
	this.HR_ALT = HR_ALT;
    }
    
    public Date getHR_ALT() {
	return HR_ALT;
    }
    
    public void setFG_ATIVO(Integer FG_ATIVO) {
	this.FG_ATIVO = FG_ATIVO;
    }
    
    public int getFG_ATIVO() {
	return FG_ATIVO;
    }
    
    public void setCD_USUARIO(String CD_USUARIO) {
	this.CD_USUARIO = CD_USUARIO;
    }
    
    public String getCD_USUARIO() {
	return CD_USUARIO;
    }
    

    
    public String toString() {
	StringBuilder builder = new StringBuilder();
	
	builder.append("{\n"
		+ " CPFCNPJ(PK): '" + CPFCNPJ
		+ "'\n CD_ESTADO: '" + CD_ESTADO
		+ "'\n CD_CIDADE: " + CD_CIDADE
		+ "\n CD_ESTCIVIL: " + CD_ESTCIVIL
		+ "\n NM_CLIENTE: '" + NM_CLIENTE
		+ "'\n NR_RG: '" + NR_RG
		+ "'\n DT_NASCIMENTO: " + DT_NASCIMENTO
		+ "\n FG_PESSOA: '" + FG_PESSOA
		+ "'\n DS_ENDERECO: '" + DS_ENDERECO
		+ "'\n NR_NUMERO: " + NR_NUMERO
		+ "\n DS_BAIRRO: '" + DS_BAIRRO
		+ "'\n DS_COMPLEMENTO: '" + DS_COMPLEMENTO
		+ "'\n NR_IE: '" + NR_IE
		+ "'\n NM_CONJUGE: '" + NM_CONJUGE
		+ "'\n DT_NASC_CONJUGE: " + DT_NASC_CONJUGE
		+ "\n NM_PAI: '" + NM_PAI
		+ "'\n NM_MAE: '" + NM_MAE
		+ "'\n DS_NATURALIDADE: '" + DS_NATURALIDADE
		+ "'\n DS_INSTRUCAO: '" + DS_INSTRUCAO
		+ "'\n DS_TRABALHO: '" + DS_TRABALHO
		+ "'\n NR_FONE_TRABALHO: '" + NR_FONE_TRABALHO
		+ "'\n NR_FONE_CEL: '" + NR_FONE_CEL
		+ "'\n NR_FONE_RESIDENCIA: '" + NR_FONE_RESIDENCIA
		+ "'\n BL_OBS: '" + BL_OBS
		+ "'\n VL_LIMITE: " + VL_LIMITE
		+ "'\n DT_LIMITE: " + DT_LIMITE
		+ "\n FG_BLOQUEADO: " + FG_BLOQUEADO
		+ "\n CD_MOTIVO_BLOQUEIO: " + CD_MOTIVO_BLOQUEIO
		+ "\n}");
	return builder.toString();
    }
}
normandesjr

Não exatamente, veja o que a API diz:

Return the persistent instance of the given entity class with the given identifier, assuming that the instance exists.
You should not use this method to determine if an instance exists (use get() instead). Use this only to retrieve an instance that you assume exists, where non-existence would be an actual error.

Portanto se você trocar para o método:

public Object get(Class clazz, Serializable id)

Irá funcionar…

Testa ai…

maniacs

Não exatamente, veja o que a API diz:

Return the persistent instance of the given entity class with the given identifier, assuming that the instance exists.
You should not use this method to determine if an instance exists (use get() instead). Use this only to retrieve an instance that you assume exists, where non-existence would be an actual error.

Portanto se você trocar para o método:

public Object get(Class clazz, Serializable id)

Irá funcionar…

Testa ai…

Você diz mudar o session.load para session.get ? se for isso … retorna o mesmo erro

maniacs

Estou com problema nessa classe … mesmo eu colocando no lugar return null no getByID ele ainda assim faz o select :shock:

public abstract class HibernateGenericDAO <T, ID extends Serializable> implements GenericDAO<T, ID>{
    
    private Log log = LogFactory.getLog(HibernateGenericDAO.class);
    
    private Class<T> persistentClass;
    private Session session;
    
    /** Creates a new instance of GenericHibernateDAO */
    public HibernateGenericDAO() {
	this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
    
    @SuppressWarnings("unchecked")
    public void setSession(Session s) {
	this.session = s;
    }
    
    @SuppressWarnings("unchecked")
    protected Session getSession() {
	return HibernateUtil.getSession();
    }
    
    @SuppressWarnings("unchecked")
    protected void closeSession() {
	HibernateUtil.closeSession();
    }
    
    @SuppressWarnings("unchecked")
    protected void beginTransaction(){
	HibernateUtil.beginTransaction();
    }
    
    @SuppressWarnings("unchecked")
    protected void commitTransaction(){
	HibernateUtil.commitTransaction();
    }
    
    @SuppressWarnings("unchecked")
    protected void rollbackTransaction(){
	HibernateUtil.rollbackTransaction();
    }
    
    @SuppressWarnings("unchecked")
    public Class<T> getPersistentClass() {
	return persistentClass;
    }
    
    @SuppressWarnings("unchecked")
    public void add(T entity) {
	Session s = getSession();
	beginTransaction();
	s.saveOrUpdate(entity);
	commitTransaction();
    }
    
    @SuppressWarnings("unchecked")
    public void remove(T entity) {
	getSession().delete(entity);
    }
    
    @SuppressWarnings("unchecked")
    public T getByID(ID id) {
         return null;
	//return (T) getSession().get(getPersistentClass(), id);
    }
    
    public T getByField(String field, String value) {
	final Criteria c = getSession().createCriteria(getPersistentClass());
	c.add(Expression.eq(field, value));
	return (T) c.uniqueResult();
    }
        
    @SuppressWarnings("unchecked")
    public List<T> getAll() {
	final Criteria c = getSession().createCriteria(getPersistentClass());
	return c.list();
    }
    
    @SuppressWarnings("unchecked")
    public List<T> getByExample(T entity) {
	Criteria crit = getSession().createCriteria(getPersistentClass());
	crit.add(Example.create(entity));
	return crit.list();
    }
    
    public void flush() {
	getSession().flush();
    }
    
    public void clear() {
	getSession().clear();
    }
}
maniacs

Parece que ja existe um metodo chamado getByID … mesmo eu removendo ele da classe generica ele ainda assim executa… se for usar findByID funciona…
alguem ai sabe o porque disso ?

M

Opa, beleza?
Isso se deve por carregar um objeto que não existe, então você precisa fazer uma verificação caso não exista o objeto!!!

maniacs

pois é nas recomentacoes do hibernate como ja foi dito aqui se usa get e nao load
eu encontrei o problema algum safado sobreescreveu o metodo getByID no HibernateClienteDAO ¬¬
vlw pela ajuda…

agora… a morte de um inoscente :twisted:

Criado 16 de novembro de 2007
Ultima resposta 17 de nov. de 2007
Respostas 9
Participantes 4