Caused by: org.hibernate.hql.ast.QuerySyntaxException: "TABLE" is not mapped

Bom dia,

Alguém pode me ajudar a mapear uma classe em um jar executável???

tenho as classes:

Finder…

....
@Override
	@SuppressWarnings("unchecked")
	@Transactional(propagation=Propagation.REQUIRED, readOnly=true)
	public List<ProdutoEstoque> buscarTudoProdutoEstoque(IFetchEager<ProdutoEstoque>... eagers) throws ObjectNotFoundException {
		Query query = em.createQuery(ERPProdutoSQL.BUSCAR_TUDO);
		List<ProdutoEstoque> produtosEstoque = (List<ProdutoEstoque>)query.getResultList();
		FetchEagerUtils.runFetch(produtosEstoque, eagers);
		return produtosEstoque;
	}
....

E a que atualiza a coluna do banco de dados…

....
public static void main(String[] args) {
		ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
				new String[] {
						"classpath:/META-INF/spring/datasource-test-context.xml",
						//"classpath:/META-INF/spring/erp-estoque-context.xml",
						//"classpath:/META-INF/spring/erp-financeiro-context.xml",
						//"classpath:/META-INF/spring/erp-cadastro-context.xml",
						//"classpath:/META-INF/spring/cadastro-context.xml",
						//"classpath:/META-INF/spring/erp-patchbay-context.xml"
						"classpath:/META-INF/spring/erp-patcher-context.xml",
						"classpath:/META-INF/spring/erp-patcher-context-dependencias.xml",
						"classpath:/META-INF/erp-persistence.xml"
				});

		BeanFactory factory = (BeanFactory) appContext;
		CorrecaoProdutoCustoMedio correcaoProdutoCustoMedio = (CorrecaoProdutoCustoMedio) factory
				.getBean("correcaoProdutoCustoMedio");
		correcaoProdutoCustoMedio.buscarProdutosEstoque();
	}

	@SuppressWarnings("unchecked")
	public List<ProdutoEstoque> buscarProdutosEstoque() {
		List<ProdutoEstoque> produtosEstoque = null;
		try {
			produtosEstoque = erpProdutoFinder.buscarTudoProdutoEstoque();
		} catch (ObjectNotFoundException e) {

		}
}
......

Porém quando executo a classe no servidor tenho o erro.

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: ProdutoEstoque is not mapped [Select t from ProdutoEstoque t]
        at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:617)
        at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:96)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:198)
        at $Proxy37.createQuery(Unknown Source)
        at com.wave.erp.cadastro.dao.produto.ERPProdutoFinder.buscarTudoProdutoEstoque(ERPProdutoFinder.java:237)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy39.buscarTudoProdutoEstoque(Unknown Source)
        at com.wave.erp.patcher.estoque.CorrecaoProdutoCustoMedio.buscarProdutosEstoque(CorrecaoProdutoCustoMedio.java:45)
        at com.wave.erp.patcher.estoque.CorrecaoProdutoCustoMedio.main(CorrecaoProdutoCustoMedio.java:38)
Caused by: org.hibernate.hql.ast.QuerySyntaxException: ProdutoEstoque is not mapped [Select t from ProdutoEstoque t]
        at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
        at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
        at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
        at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
        at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
        at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
        at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
        at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:93)
        ... 20 more

Tenho que mapear a classe no .xml ou no Annotation???

package com.wave.erp.orm.estoque.lancamento;

import java.io.Serializable;
import java.math.BigDecimal;

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.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import com.dpcomp.webevolution.framework.dao.IFetchEager;
import com.wave.erp.orm.cadastro.tipomovimento.TipoMovimento;

@Entity
@Table(name="TBL_ERP_PRODUTO_ESTOQUE")
public class ProdutoEstoque implements Serializable {
	private static final long serialVersionUID = 5910945371676763445L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	
	@OneToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="ID_LANCAMENTO_ESTOQUE", nullable=false)
	private LancamentoEstoque lancamentoEstoque;
	
	@OneToOne(fetch=FetchType.EAGER, optional=false)
	@JoinColumns({
        @JoinColumn(name="ID_PRODUTO", referencedColumnName="ID_PRODUTO"),
        @JoinColumn(name="ID_LOCAL_ESTOQUE", referencedColumnName="ID_LOCAL_ESTOQUE")
    })
    @Fetch(FetchMode.JOIN)
	private ProdutoLocal produtoLocal;
	
	@OneToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="ID_TIPO_MOVIMENTO", nullable=false)
	private TipoMovimento tipoMovimento;
	
	@Column(name="QUANTIDADE")
	private BigDecimal quantidade;
	
	@Column(name="VALOR_UNITARIO")
	private BigDecimal valorUnitario;
	
	@Column(name="IDENTIFICACAO")
	private String identificacao;
	
	@Column(name="CUSTO_MEDIO")
	private BigDecimal custoMedio;
	
	@Transient
	public static IFetchEager<ProdutoEstoque> FETCH_ALL = new IFetchEager<ProdutoEstoque>(){
		@Override
		public void fetch(ProdutoEstoque orm) {
			FETCH_PRODUTO_LOCAL.fetch(orm);
			FETCH_LANCAMENTO_ESTOQUE.fetch(orm);
			FETCH_ERPCLIENTE.fetch(orm);
			FETCH_TIPO_MOVIMENTO.fetch(orm);
		}
	};
	
	@Transient
	public static IFetchEager<ProdutoEstoque> FETCH_PRODUTO_LOCAL = new IFetchEager<ProdutoEstoque>(){
		@Override
		public void fetch(ProdutoEstoque orm) {
			if (orm.getProdutoLocal() != null){
				orm.getProdutoLocal().getDataUltimaAlteracao();
			}
		}
	};
	
	@Transient
	public static IFetchEager<ProdutoEstoque> FETCH_LANCAMENTO_ESTOQUE = new IFetchEager<ProdutoEstoque>(){
		@Override
		public void fetch(ProdutoEstoque orm) {
			if (orm.getLancamentoEstoque() != null){
				orm.getLancamentoEstoque().getDocumento();				
			}
		}
	};
	
	@Transient
	public static IFetchEager<ProdutoEstoque> FETCH_ERPCLIENTE = new IFetchEager<ProdutoEstoque>(){
		@Override
		public void fetch(ProdutoEstoque orm) {
			if (orm.getLancamentoEstoque().getCliente() != null){
				orm.getLancamentoEstoque().getCliente().getNome();				
			}
		}
	};
	
	@Transient
	public static IFetchEager<ProdutoEstoque> FETCH_TIPO_MOVIMENTO = new IFetchEager<ProdutoEstoque>(){
		@Override
		public void fetch(ProdutoEstoque orm) {
			if (orm.getTipoMovimento() != null){
				orm.getTipoMovimento().getDescricao();
			}
		}
	};
	
	public Long getId() {
		return id;
	}

	public LancamentoEstoque getLancamentoEstoque() {
		return lancamentoEstoque;
	}

	public void setLancamentoEstoque(LancamentoEstoque lancamentoEstoque) {
		this.lancamentoEstoque = lancamentoEstoque;
	}

	public TipoMovimento getTipoMovimento() {
		return tipoMovimento;
	}

	public void setTipoMovimento(TipoMovimento tipoMovimento) {
		this.tipoMovimento = tipoMovimento;
	}

	public BigDecimal getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(BigDecimal quantidade) {
		this.quantidade = quantidade;
	}

	public BigDecimal getValorUnitario() {
		return valorUnitario;
	}

	public void setValorUnitario(BigDecimal valorUnitario) {
		this.valorUnitario = valorUnitario;
	}

	public String getIdentificacao() {
		return identificacao;
	}

	public void setIdentificacao(String identificacao) {
		this.identificacao = identificacao;
	}
	
	public ProdutoLocal getProdutoLocal() {
		return produtoLocal;
	}

	public void setProdutoLocal(ProdutoLocal produtoLocal) {
		this.produtoLocal = produtoLocal;
	}

	public BigDecimal getCustoMedio() {
		return custoMedio;
	}

	public void setCustoMedio(BigDecimal custoMedio) {
		this.custoMedio = custoMedio;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ProdutoEstoque other = (ProdutoEstoque) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
}

Abraços…

você pode usar tanto a configuração por anotações quanto por xml, mas para cada um destes você vai ter que usar uma classe diferente para criar o seu session factory. Para xml e anotações se bem me lembro são respectivamente org.springframework.orm.hibernate3.LocalSessionFactoryBean e org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean.

a proposito, spring superior a 2.5 né?

se não resolver, coloque aqui a parte do arquivo de configuração do spring responsável pelo acesso ao banco de dados, obviamente não precisa por usuário e senha… caso esteja referenciando um hibernate.cfg.xml poste-o também.

Para não ter problema de nome de classe mapeada costumo colocar nas queries sempre pelo name da class:

String query = "Select t from "+ProdutoEstoque.class.getName()+" t ";

Isso considerando que ProdutoEstoque é um @Entity

Verifica nas configuracoes do spring.

ProdutoEstoque is not mapped [Select t from ProdutoEstoque t]

E como se ele nao reconhecesse o objeto ProdutoEstoque, ou seja, nao esta mapeado.

[quote=maior_abandonado]você pode usar tanto a configuração por anotações quanto por xml, mas para cada um destes você vai ter que usar uma classe diferente para criar o seu session factory. Para xml e anotações se bem me lembro são respectivamente org.springframework.orm.hibernate3.LocalSessionFactoryBean e org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean.

a proposito, spring superior a 2.5 né?

se não resolver, coloque aqui a parte do arquivo de configuração do spring responsável pelo acesso ao banco de dados, obviamente não precisa por usuário e senha… caso esteja referenciando um hibernate.cfg.xml poste-o também.[/quote]

Aqui…

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"&gt;

   &lt;bean id="erp-dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;
   		&lt;property name="driverClassName" value="com.mysql.jdbc.Driver"/&gt;
   		&lt;property name="url" value="jdbc:mysql://localhost:3306/"/&gt;
   		&lt;property name="username" value=""/&gt;
   		&lt;property name="password" value=""/&gt; 	
   &lt;/bean&gt; 
   
   &lt;bean id="erp-entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
   		&lt;property name="persistenceXmlLocation"
			value="classpath:META-INF/erp-persistence.xml" /&gt;
   		&lt;property name="dataSource" ref="erp-dataSource"/&gt;
   		&lt;property name="jpaVendorAdapter"&gt;
   			&lt;bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"&gt;
   				&lt;property name="database" value="MYSQL"/&gt;
   				&lt;property name="generateDdl" value="false"/&gt;
   				&lt;property name="showSql" value="true"/&gt;
   			&lt;/bean&gt;
   		&lt;/property&gt;
   &lt;/bean&gt;
   &lt;tx:annotation-driven transaction-manager="jpaTransactionManager"/&gt;
   
   &lt;bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/&gt;
   
   &lt;bean name="jpaTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
   		&lt;property name="entityManagerFactory" ref="erp-entityManagerFactory"/&gt;
   &lt;/bean&gt;
   
   &lt;!-- &lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;
   		&lt;property name="dataSource" ref="dataSource"/&gt;
   &lt;/bean&gt; --&gt;
&lt;/beans&gt;

Não estou usando mapeamento por xml =/
Existe alguma forma de fazer por annotations para esse caso???

ayslanms não funcionou =/

Nao precisa em relacao ao hibernate fazer mapeamento no xml ou nas classes, pro hibernate, so 1 dos 2 ja serve, a questao é o Spring, pois se voce esta trabalhando com injecoes de dependencia, o certo é mapear as classes no spring Tambem.

Cheguei a colocar

	<!-- Objetos -->
	<bean id="produtoEstoque" class=".............estoque.lancamento.ProdutoEstoque"/>

Mesmo assim fala que não está mapeada =/

Estou usando esta classe em uma dependência separada para criar um jar executável no projeto. Será que preciso criar um xml nesta dependência e mapear a classe nele???

:shock: :?:

Se ela estiver sendo mapeada corretamente o hibernate mostrará no log ao iniciar.
Você falou que está em um jar separado talvez tenha que adicionar a seguinte configuração no persistence.xml:

<jar-file>/lib/outro-jar.jar</jar-file>

Esse “/lib” vai depender de como está o seu projeto pode ser que seja “./lib”.

[quote=ayslanms]Se ela estiver sendo mapeada corretamente o hibernate mostrará no log ao iniciar.
Você falou que está em um jar separado talvez tenha que adicionar a seguinte configuração no persistence.xml:

<jar-file>/lib/outro-jar.jar</jar-file>

Esse “/lib” vai depender de como está o seu projeto pode ser que seja “./lib”. [/quote]

Nada mano =/
o erro continua…

Alguém ajuda???
Mas alguma resposta??

<