Вызвано: org.hibernate.MappingException: неизвестный объект: новый объект. JTA

Из-за сложности моей базы данных я решил создать новый объект, в котором указал только те параметры, которые буду использовать. Для выполнения пользовательского запроса я использую createNativeQuery в JPA. Следуя за моим объектом.

ПОЖО:

@Entity
public class Unidade implements Serializable{

    private static final long serialVersionUID = 1L;


    private Long numeroUnidade;
    private String nomeUnidade;
    private Integer numeroCep;
    private Integer numeroCepComplemento;
    private String tipoServico;
    private Integer status;
    private String logradouro;
    private String bairro;
    private String cidade;
    private String uf;
    private Integer statusVinculo; 

   //getter and setters

В настоящее время я использую следующий выбор, чтобы вернуть простое целое число и работает без каких-либо проблем.

@PersistenceContext(unitName="projetoAtividade")
private EntityManager em;

public void selectTeste(){
        int quantidade = (Integer) em.createNativeQuery("select count(*) from abc.nattbu29_escritorio;").getSingleResult();
        System.out.println("========== QUANTIDADE DE REGISTRO NA TABELA ===========");
        System.out.println(quantidade);
    }

Хотя предыдущий запрос работал нормально, при отправке сложного запроса с указанием соответствующего псевдонима, используя также createNativeQuery и возвращая объект, спящий режим выдает исключение (org.hibernate.MappingException: Unknown).

Вспоминая, что я создаю новый класс, указав @Entity.

Запрос:

@SuppressWarnings("unchecked")
        public List<UnidadeTeste> buscarUnidadeGenerica(int numeroCeps, int numeroComplementoCeps){
            List<UnidadeTeste> lsita = new ArrayList<UnidadeTeste>();
            String query = "SELECT "
                    +"TBZ21.NATURAL as numeroPv, "
                    +"TBZ21.UNIDADE as nomePv, "
                    +"TBZ21.SITUACAO as statusVinculacao, "
                    +"TBJ55.TPO_ATUACAO_U44 as tipoServAZW, "
                    +"TBJ55.SITUACAO_ATUAL as status, "
                    +"TBH18.LOCALIDADE as cidade, "
                    +"'' as bairro, "
                    +"'' as logradouro, "
                    +"TBH18.CEP as numeroCep, "
                    +"TBH18.CEP_COMPLEMENTO as numeroCepComplemento, "
                    +"TBH18.FK_AZWVWL22_UNISG as uf "
                    +"FROM AZW.AZWTBJ55_RGATUACAO TBJ55 "
                    +"LEFT JOIN AZW.AZWTBH18_LOCALIDADE TBH18 ON "
                    +"TBH18.LOCALIDADEE = TBJ55.LOCALIDADEE "
                    +"LEFT JOIN AZW.AZWTBZ21_UNIDADE TBZ21 ON "
                    +"TBJ55.NATURAL = TBZ21.NATURAL "
                    +"WHERE TBH18.CEP = ?1 "
                        +"AND TBH18.CEP_COMPLEMENTO = ?2; "

            lsita = em.createNativeQuery(query, Unidade.class)
                    .setParameter(1, numeroCeps)
                    .setParameter(2, numeroComplementoCeps)
                    .getResultList();
            System.out.println(lsita.size()+"<<<<=====================");
            return lsita;
        }

Ошибка:

Caused by: org.hibernate.MappingException: Unknown entity: br.com.project.modelo.UnidadeTeste
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:1031) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.getSQLLoadable(SQLQueryReturnProcessor.java:336) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processRootReturn(SQLQueryReturnProcessor.java:377) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.processReturn(SQLQueryReturnProcessor.java:356) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.loader.custom.sql.SQLQueryReturnProcessor.process(SQLQueryReturnProcessor.java:172) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.loader.custom.sql.SQLCustomQuery.<init>(SQLCustomQuery.java:87) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.query.spi.NativeSQLQueryPlan.<init>(NativeSQLQueryPlan.java:67) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getNativeSQLQueryPlan(QueryPlanCache.java:155) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.internal.AbstractSessionImpl.getNativeSQLQueryPlan(AbstractSessionImpl.java:218) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:224) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156) [hibernate-core-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    ... 84 more

В моем поиске в Интернете почти все темы форума были единодушны в ответе решения: «Поместите @Entity перед объявлением класса», но это не работает для меня.

Я «потратил» весь свой день, пытаясь найти сработавшие решения, но, к сожалению, не добился успеха. Кто-то может сказать новый способ решения моей проблемы? Я тестировал в 2 разных проектах и ​​сталкивался с той же проблемой.

Дополнение вопроса:

Ребята, я попытался создать @SqlResultSetMapping в своем классе, последующий код, но теперь спящий режим выдает другое исключение:

 ERROR [org.jboss.ejb3.invocation] (http--127.0.0.1-8888-2) JBAS014134: EJB Invocation failed on component AtividadeEJB for method public void br.com.project.jboss.modelo.AtividadeEJB.testeChamada(): javax.ejb.EJBException: javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown SqlResultSetMapping [UnidadeResult]
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:166) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:304) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:190) [jboss-as-ejb3-7.1.1.Final.jar:7.1.1.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288) [jboss-invocation-1.1.1.Final.jar:1.1.1.Final]

Мой новый POJO:

@Entity
@SqlResultSetMapping(name="UnidadeResult", 
entities={ 
    @EntityResult(entityClass=UnidadeTeste.class, fields={
        @FieldResult(name="tx_descricao", column="nomePv"),
        @FieldResult(name="nu_idntr_pessoa", column="id")})},
columns={
    @ColumnResult(name="nomePv")}
)


public class UnidadeTeste implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;

    private String nomePv;

    public String getNomePv() {
        return nomePv;
    }

    public void setNomePv(String nomePv) {
        this.nomePv = nomePv;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

Мой EJB:

@SuppressWarnings("unchecked")
    public void testeChamada(){
        List<Object> lista = em.createNativeQuery("SELECT nu_idntr_pessoa as id, email as nomePv FROM pessoa;", "UnidadeResult").getResultList();
        System.out.println("===============>>"+lista.size());
    }

person Felipe Cabral    schedule 18.03.2016    source источник
comment
Можете ли вы проверить в своем классе объектов, что вы импортировали javax.persistence.Entity вместо org.hibernate.annotations.Entity, и сообщили ли вы JPA об этом объекте с помощью тега сопоставления persistence.xml или component-scan и т. д.   -  person Madhusudana Reddy Sunnapu    schedule 19.03.2016
comment
Итак, я использую только javax.persistence.Entity в своем проекте. Я считаю, что эта проблема возникла не по этой причине. Теперь после реализации SqlResultSetMapping возникает новая ошибка. Вы не знаете, нужна ли мне какая-то специальная библиотека?   -  person Felipe Cabral    schedule 19.03.2016


Ответы (3)


если вы хотите вернуть результаты собственного запроса объекту, я бы предложил использовать SqlResultSetMapping.

В противном случае установите тип возвращаемого значения:

List<Object[]> results = em.createNativeQuery(query)
                .setParameter(1, numeroCeps)
                .setParameter(2, numeroComplementoCeps)
                .getResultList();

А затем прокрутите список результатов и приведите каждый член массива Object к его типу данных.

person neal    schedule 19.03.2016
comment
Я улучшил свой вопрос, добавив новый результат моего теста, применив ваше предложение об использовании SqlResultSetMapping и поместив список результатов в общий список объектов, но это тоже не работает. Спасибо за ваше время. - person Felipe Cabral; 19.03.2016

List‹UnidadeTeste> lsita = new ArrayList‹UnidadeTeste>();

lsita = em.createNativeQuery(запрос, Unidade.class)

Здесь несоответствие типов. Исключение очевидно: Неизвестный объект: br.com.project.modelo.UnidadeTeste

Ваша сущность — Unidade, поэтому вы должны вернуть List<Unidade>, а не UnidadeTeste.

В противном случае попробуйте SqlResultSetMapping

person Gab    schedule 19.03.2016
comment
Это была моя вина, но даже исправить эту часть кода, пока не работает. Я улучшил свой вопрос, добавив новый результат моего теста, применив ваше предложение по использованию SqlResultSetMapping, но это тоже не работает. Спасибо за ваше время. - person Felipe Cabral; 19.03.2016

Мое решение было:

В этом разделе: Как сопоставить собственный запрос с POJO, если в моем проекте нет Entity? точно описывают мою проблему. Но даже читая ранее, я не мог понять маленькую деталь, которая решила мою проблему.

Даже создание простого объекта для получателя в результате моего запроса необходимо для сопоставления моего класса с persistence.xml. это была моя ошибка!

Итак, мой проект сейчас:

постоянство.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence
package br.com.project.modelo;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class UnidadeTeste {

    @Id
    private Long id;

    private String description;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}
0.xsd"> <persistence-unit name="projetoAtividade" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>java:/projetoAtividade</jta-data-source> //another classes <class>br.com.project.modelo.UnidadeTeste</class> //properties of connection

UnidadeTeste.class:

package br.com.project.modelo;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class UnidadeTeste {

    @Id
    private Long id;

    private String description;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

EJB:

@SuppressWarnings("unchecked")
    public void testeChamada(){
        List<UnidadeTeste> lista = em.createNativeQuery("SELECT nu_idntr_pessoa AS id, email AS description FROM Pessoa", UnidadeTeste.class).getResultList();
        System.out.println("===============>>"+lista.size());
    }

Помните, что вам нужно поместить псевдонимы для столбца с тем же именем в атрибутах, которые вы создали в своем классе.

person Felipe Cabral    schedule 19.03.2016