2
respostas

java.lang.NoSuchMethodError: org.hibernate.persister.entity.EntityPersister.getIdentifier

Boa tarde, Estou dando manutenção em um projeto meio antigo e me deparei com um erro que está muito complicado de resolver, sei que não tem haver com os cursos, mas se alguém puder me ajudar eu agradeço muito. Eis o que está ocorrendo, quando tento persistir uma única entidade (sem relacionamento com outras) tudo funciona perfeitamente, porém quando há um relacionamento, lança a seguinte exceção.

Caused by: java.lang.NoSuchMethodError: org.hibernate.persister.entity.EntityPersister.getIdentifier(Ljava/lang/Object;Lorg/hibernate/engine/SessionImplementor;)Ljava/io/Serializable;
    at org.hibernate.envers.tools.Tools.getIdentifier(Tools.java:67)
    at org.hibernate.envers.tools.Tools.entitiesEqual(Tools.java:50)
    at org.hibernate.envers.entities.mapper.relation.ToOneIdMapper.mapToMapFromEntity(ToOneIdMapper.java:71)
    at org.hibernate.envers.entities.mapper.MultiPropertyMapper.map(MultiPropertyMapper.java:86)
    at org.hibernate.envers.synchronization.work.AddWorkUnit.<init>(AddWorkUnit.java:47)
    at org.hibernate.envers.event.AuditEventListener.onPostInsert(AuditEventListener.java:148)
    at org.hibernate.action.EntityInsertAction.postInsert(EntityInsertAction.java:131)
    at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:110)
    at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1001)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:339)
    at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    at com.agrosolutions.sai.service.impl.CulturaServiceImpl$$EnhancerByCGLIB$$25812640.salvar(<generated>)
    at com.agrosolutions.sai.view.CadastrarCulturaBean.gravar(CadastrarCulturaBean.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:279)
    ... 61 more

Segue as entidades que estou tentando persistir.

Model.java

@MappedSuperclass
public class Model implements Serializable {

    private static final long serialVersionUID = -9107527412541149651L;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "entity_sequence")
    private Long id;

    @Version
    @Column
    private Long version;

    // Getters, setters, equals e hashCode
}

Atividade.java

@Entity
@SequenceGenerator(name = "entity_sequence", sequenceName = "sq_Atividade", allocationSize = 1)
@Table
@Audited
@NamedQueries({
    @NamedQuery(name = "Atividade.todos", 
               query = "SELECT a FROM Atividade a ORDER BY a.nome ASC"),               
    @NamedQuery(name = "Atividade.excluir", 
               query = "DELETE FROM Atividade a WHERE a.id = :pId")               
   })
public class Atividade extends Model{

    private static final long serialVersionUID = 1566315074224178619L;
    private String nome;

    @Transient
    private String sortField;
    @Transient
    private SortOrder sortOrder;

    // Getters e setters
}

Cultura.java

@Entity
@SequenceGenerator(name = "entity_sequence", sequenceName = "sq_Cultura", allocationSize = 1)
@Table
@BatchSize(size=40)
@Audited
@NamedQueries({
    @NamedQuery(name = "Cultura.todos",  
               query = "SELECT c FROM Cultura c ORDER BY c.nome ASC"),               
    @NamedQuery(name = "Cultura.excluir", 
               query = "DELETE FROM Cultura c WHERE c.id = :pId")
   })
public class Cultura extends Model{

    private static final long serialVersionUID = -5301045033069126100L;

    @Column(unique=true)
    private String nome;
    @ManyToOne
    private Atividade atividade;
    private String image;

    @Transient
    private String sortField;
    @Transient
    private SortOrder sortOrder;

    public Cultura() {
        super();
        image = "cultura.jpg";
    }

    @OneToMany(cascade = CascadeType.ALL, mappedBy="cultura")
    @BatchSize(size=10)
    private List<Variedade> variedades;

    // Getters e setters

}

Já procurei em vários lugares e não encontrei nada sobre, isso. Preciso entregar o projeto e não sei mais o que fazer.

Desde já agradeço.

2 respostas

Sua classe Model não deveria ser uma entidade?

Será que não tá faltando um entity anotado nela?

@Entity
@MappedSuperclass
public class Model implements Serializable {

Posta o seu dao, quero ver aonde você ta persistindo os dados.

E uma outra coisa também, não suas model não deveria ter um identificador? algo como id? Sei que você está dando extends, na classe que já tem um id, mais tenta colocar nas classes um id e faz o teste.

E por ultimo uma duvida, qual versão está usando do hibernat?

Cara, alterei aqui para adicionar o @Entity mas como eu já imaginava não deu certo, pois essa classe não é persistida então creio que não há necessidade de anotar com @Entity.

Segue o dao.

DAOImpl.java

@Repository
public class DAOImpl<Entidade extends Model> implements DAO<Entidade> {

    private static final long serialVersionUID = 7538940694726270539L;

    @PersistenceContext
    protected EntityManager entityManager;

    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public Entidade salvar(Entidade entidade) {
        if (entidade.getId() != null) {
            return entityManager.merge(entidade);
        }
        entityManager.persist(entidade);
        return entidade;
    }

    public void salvar(List<Entidade> entidades) {
        for (Entidade entidade : entidades) {
            salvar(entidade);
        }
        entityManager.flush();
    }

    public void remover(Entidade entidade) {
        entityManager.remove(entidade);
        entityManager.flush();
    }

    public void remover(List<Entidade> entidades) {
        for (Entidade entidade : entidades) {
            remover(entidade);
        }
    }

    public List<Entidade> obterTodos() {
        return entityManager.createQuery("FROM " + getClasseEntidade().getSimpleName(), getClasseEntidade()).getResultList();
    }

    public Entidade obterPorId(Long idEntidade) {
        return entityManager.find(getClasseEntidade(), idEntidade);
    }

    @SuppressWarnings("unchecked")
    public List<Entidade> obterPorParametro(Entidade entidade, Integer indiceInicio, Integer quantidade) {
        Criteria criterio = criarCriteriaExample(entidade, MatchMode.START);
        if(indiceInicio!=null){
            criterio.setFirstResult(indiceInicio);
            criterio.setMaxResults(quantidade);
        }
        return criterio.list();
    }

    public Entidade obterPorReferencia(Long id) {
        return this.entityManager.getReference(getClasseEntidade(),id);
    }    
    public int quantidade(Entidade entidade) {
        return ((Number) criarCriteriaExample(entidade, MatchMode.ANYWHERE).setProjection(Projections.rowCount()).uniqueResult()).intValue();
    }

    /**
     * Cria um criteria e adiciona a entidade passada por parametro como exemplo para a pesquisa.
     * Este metodo deve ser sobrescrito para adicionar outros parametros na busca.
     *
     * @param entidade
     * @return
     */
    protected Criteria criarCriteriaExample(Entidade entidade, MatchMode match) {
        Example criteriaExample = Example.create(entidade);
        return getSession().createCriteria(getClasseEntidade()).add(criteriaExample.enableLike(match).ignoreCase().excludeZeroes());
    }

    /**
     * Obtem a classe do conjunto de entidades que o ManagerBean corrente gerencia
     *
     * @return
     */
    @SuppressWarnings("unchecked")
    protected Class<Entidade> getClasseEntidade() {
        return (Class<Entidade>) ((java.lang.reflect.ParameterizedType) this.getClass().getGenericSuperclass())
                .getActualTypeArguments()[0];
    }

    protected Session getSession() {
        if (entityManager.getDelegate() instanceof EntityManagerImpl) {
            return ((EntityManagerImpl) entityManager.getDelegate()).getSession();
        } else if (entityManager.getDelegate() instanceof Session) {
            return (Session) entityManager.getDelegate();
        }
        return null;
    }

    @SuppressWarnings("unchecked")
    public List<Entidade> executarQuery(String query, Map<String, Object> parametros, Integer indice, Integer qtdItemMaximo) {
        Query queryNamed = null;
        try {
            queryNamed = entityManager.createNamedQuery(query);
        } catch (Exception e) {
            queryNamed = entityManager.createQuery(query, getClasseEntidade());
        }
        if (indice!=null){
            queryNamed.setFirstResult(indice);
            queryNamed.setMaxResults(qtdItemMaximo);
        }
        if(parametros!=null){
            Set<String> keyParametros = parametros.keySet();
            for (String nomeParamentro : keyParametros) {
                queryNamed.setParameter(nomeParamentro, parametros.get(nomeParamentro));
            }
        }
        return queryNamed.getResultList();
    }

    @SuppressWarnings("unchecked")
    public Entidade executarQuery(String query, Map<String, Object> parametros) {
        Query queryNamed = entityManager.createNamedQuery(query);
        if(parametros!=null){
            Set<String> keyParametros = parametros.keySet();
            for (String nomeParamentro : keyParametros) {
                queryNamed.setParameter(nomeParamentro, parametros.get(nomeParamentro));
            }
        }
        return (Entidade) queryNamed.getSingleResult();
    }    

    public int executarComando(String query, Map<String, Object> parametros) {
        Query queryNamed = entityManager.createNamedQuery(query);
        if(parametros!=null){
            Set<String> keyParametros = parametros.keySet();
            for (String nomeParamentro : keyParametros) {
                queryNamed.setParameter(nomeParamentro, parametros.get(nomeParamentro));
            }
        }
        return queryNamed.executeUpdate();
    }

    @SuppressWarnings("unchecked")
    public List<String> executarQueryString(String query, Map<String, Object> parametros, Integer indice, Integer qtdItemMaximo) {
        Query queryNamed = entityManager.createNamedQuery(query, String.class);
        if (indice!=null){
            queryNamed.setFirstResult(indice);
            queryNamed.setMaxResults(qtdItemMaximo);
        }
        if(parametros!=null){
            Set<String> keyParametros = parametros.keySet();
            for (String nomeParamentro : keyParametros) {
                queryNamed.setParameter(nomeParamentro, parametros.get(nomeParamentro));
            }
        }
        return queryNamed.getResultList();
    }    

}

CulturaDAOImpl.java

@Repository
public class CulturaDAOImpl extends DAOImpl<Cultura> implements CulturaDAO {

    private static final long serialVersionUID = -4919834906533535707L;
    static Logger logger = Logger.getLogger(CulturaDAOImpl.class);

    @Override
    public void excluir(Cultura cultura) {
        @SuppressWarnings("unchecked")
        Map<String, Object> parametros = new HashedMap();
        parametros.put("pId",cultura.getId());
        executarComando("Cultura.excluir", parametros);
    }    

    @Override
    public List<Cultura> obterTodos() {
        return executarQuery("Cultura.todos", null, null, null);
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<GraficoPizza> culturaAtivaPorArea(Area a, Date data) {
        String jpql = "SELECT new "
                + GraficoPizza.class
                + " (cul.nome, count(*)) from Plantio p JOIN p.cultivo c JOIN c.cultura cult JOIN p.setor s JOIN s.irrigante i WHERE i.area = :pArea AND c.dataInicio <= :pData AND (p.dataFim IS NULL OR p.dataFim >= :pData) GROUP BY cul.nome ";
        return (List<GraficoPizza>) this.entityManager.createQuery(jpql)
                .setParameter("pArea", a).setParameter("pData", data)
                .getSingleResult();
    }

    @Override
    public Criteria criarCriteriaExample(Cultura entidade, MatchMode match) {

        Criteria criteria = super.criarCriteriaExample(entidade, match);

        criteria = prepararCriteria(entidade, criteria);        
        return criteria;
    }

    private Criteria prepararCriteria(Cultura entidadeLocal, Criteria criteria) {
        Criteria a = null;
        if (entidadeLocal.getAtividade() != null) {
            a = criteria.createCriteria("atividade");
            a.add(Restrictions.eq("id", entidadeLocal.getAtividade().getId()));
        }
        if (entidadeLocal.getSortField().equals("nome")) {
            if (entidadeLocal.getSortOrder().equals(SortOrder.DESCENDING)) {
                criteria.addOrder(Order.desc("nome"));
            }else{
                criteria.addOrder(Order.asc("nome"));
            }
        }
        return criteria;

    }

    @Override
    @SuppressWarnings("unchecked")
    public List<GraficoPizzaIndicadores> totalHaPorCulturaPorMunicipio(Municipio m) {
        List<GraficoPizzaIndicadores> retorno = new ArrayList<GraficoPizzaIndicadores>();
        String jpql      = "SELECT distinct(cult.nome) as nome, sum(a.areatotal) as total from AtividadeEconomica a JOIN a.cultura cult WHERE a.municipio = :pMunicipio and a.dataFim IS NULL GROUP BY cult.nome ORDER BY total desc";
        String jpqlTotal = "SELECT sum(a.areatotal) as total from AtividadeEconomica a JOIN a.cultura cult WHERE a.municipio = :pMunicipio and a.dataFim IS NULL";
        BigDecimal total = this.entityManager.createQuery(jpqlTotal, BigDecimal.class).setParameter("pMunicipio", m).getSingleResult();
        List<Object[]> objs = (List<Object[]>) this.entityManager.createQuery(jpql).setParameter("pMunicipio", m).getResultList();
        for (Object[] p : objs) {
            String nome = (String) p[0];
            double qtd = new BigDecimal(p[1].toString(), BigDecimalUtil.MC).doubleValue();

            GraficoPizzaIndicadores g = new GraficoPizzaIndicadores( nome, qtd, total.doubleValue(), "ha");
            retorno.add(g);
        }

        return retorno;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<GraficoPizzaIndicadores> totalHaPorCulturaPorBacia(BaciaHidrografica b) {
        List<GraficoPizzaIndicadores> retorno = new ArrayList<GraficoPizzaIndicadores>();
        String jpql      = "SELECT distinct(cult.nome) as nome, sum(a.areatotal) as total from AtividadeEconomica a JOIN a.cultura cult JOIN a.municipio m WHERE m.bacia = :pBacia GROUP BY cult.nome ORDER BY total DESC";
        String jpqlTotal = "SELECT sum(a.areatotal) as total from AtividadeEconomica a JOIN a.cultura cult JOIN a.municipio m WHERE m.bacia = :pBacia";
        BigDecimal total = this.entityManager.createQuery(jpqlTotal, BigDecimal.class).setParameter("pBacia", b).getSingleResult();
        List<Object[]> objs = (List<Object[]>) this.entityManager.createQuery(jpql).setParameter("pBacia", b).getResultList();
        for (Object[] p : objs) {
            String nome = (String) p[0];
            double qtd = new BigDecimal(p[1].toString(), BigDecimalUtil.MC).doubleValue();

            GraficoPizzaIndicadores g = new GraficoPizzaIndicadores( nome, qtd, total.doubleValue(), "ha");
            retorno.add(g);
        }

        return retorno;
    }

    @Override
    @SuppressWarnings("unchecked")
    public List<GraficoPizzaIndicadores> totalCicloCulturaPorBacia(BaciaHidrografica b) {
        List<GraficoPizzaIndicadores> retorno = new ArrayList<GraficoPizzaIndicadores>();
        String jpql      = "SELECT distinct(ind.cicloCultura) as nome, count(*) as total from Indicadores ind JOIN ind.atividadeEconomica a JOIN a.cultura cult JOIN a.municipio m WHERE m.bacia = :pBacia AND a.dataFim IS NULL GROUP BY ind.cicloCultura ORDER BY total DESC";
        String jpqlTotal = "SELECT count(*) as total from Indicadores ind JOIN ind.atividadeEconomica a JOIN a.cultura cult JOIN a.municipio m WHERE m.bacia = :pBacia AND a.dataFim IS NULL";
        BigDecimal total = new BigDecimal((Long)this.entityManager.createQuery(jpqlTotal).setParameter("pBacia", b).getSingleResult());
        List<Object[]> objs = (List<Object[]>) this.entityManager.createQuery(jpql).setParameter("pBacia", b).getResultList();
        for (Object[] p : objs) {
            String nome = (p[0].toString().equals("0.50") ? "Permanente" : (p[0].toString().equals("0.75") ? "Tempo Long" : "Tempo Curto"));
            double qtd = new BigDecimal(p[1].toString(), BigDecimalUtil.MC).doubleValue();

            GraficoPizzaIndicadores g = new GraficoPizzaIndicadores( nome, qtd, total.doubleValue(), "un");
            retorno.add(g);
        }

        return retorno;
    }

}