2012-07-21 10 views
5

Ich entwickle eine Anwendung mit JPA mit Hibernate und Postgresql. Mit dem Netbeans-Assistenten habe ich Entitätsklassen aus der vorhandenen Datenbank erstellt. Der Extrakt aus einer dieser Klassen ist die folgende:Abfrage von Postgresql mit Hibernate (JPA) findet keine Tabelle

@Entity 
@Table(name = "ADM_TYPES") 
@XmlRootElement 
@NamedQueries({ 
    @NamedQuery(name = "AdmTypes.findAll", query = "SELECT a FROM AdmTypes a"), 
    @NamedQuery(name = "AdmTypes.findByCType", query = "SELECT a FROM AdmTypes a WHERE a.cType = :cType"), 
    @NamedQuery(name = "AdmTypes.findByVlType", query = "SELECT a FROM AdmTypes a WHERE a.vlType = :vlType"), 
    @NamedQuery(name = "AdmTypes.findByDsType", query = "SELECT a FROM AdmTypes a WHERE a.dsType = :dsType"), 
    @NamedQuery(name = "AdmTypes.findByVlStatus", query = "SELECT a FROM AdmTypes a WHERE a.vlStatus = :vlStatus"), 
    @NamedQuery(name = "AdmTypes.findByCTypePrefix", query = "SELECT a FROM AdmTypes a WHERE a.cType like :cTypePrefix")}) 
public class AdmTypes implements Serializable { 

In einem EJB ich habe:

@Stateless 
@LocalBean 
public class ModelManagement { 
    @PersistenceContext 
    private EntityManager em; 

    public List<AdmTypes> listAdmTypesPrefix(String prefix){ 
     TypedQuery<AdmTypes> query = em.createNamedQuery("AdmTypes.findByCTypePrefix", AdmTypes.class); 
     query.setParameter("cTypePrefix", "'%"+prefix+"%'"); 
     return query.getResultList(); 
    } 

Wenn ich versuche, ModelManagement.listAdmTypesPrefix("APREFIX") auszuführen Es erzeugt den folgenden Fehler:

javax.ejb.EJBException 
    at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5193) 
    at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:5091) 
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4879) 
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2039) 
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1990) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:222) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
    at $Proxy192.listAdmTypesPrefix(Unknown Source) 
    at com.librethinking.simmodsys.ejb.__EJB31_Generated__ModelManagement__Intf____Bean__.listAdmTypesPrefix(Unknown Source) 
    at com.librethinking.MockServlet.processRequest(MockServlet.java:64) 
    at com.librethinking.MockServlet.doGet(MockServlet.java:94) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: ERROR: relation "adm_types" does not exist 
    Position: 136 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1367) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1295) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:265) 
    at com.librethinking.simmodsys.ejb.ModelManagement.listAdmTypesPrefix(ModelManagement.java:39) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5366) 
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162) 
    at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861) 
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) 
    at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370) 
    at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5338) 
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5326) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214) 
    ... 32 more 
Caused by: org.hibernate.exception.SQLGrammarException: ERROR: relation "adm_types" does not exist 
    Position: 136 
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122) 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 
    at $Proxy194.executeQuery(Unknown Source) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:829) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) 
    at org.hibernate.loader.Loader.doList(Loader.java:2438) 
    at org.hibernate.loader.Loader.doList(Loader.java:2424) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2254) 
    at org.hibernate.loader.Loader.list(Loader.java:2249) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1248) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:256) 
    ... 55 more 
Caused by: org.postgresql.util.PSQLException: ERROR: relation "adm_types" does not exist 
    Position: 136 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:510) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:386) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:271) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) 
    ... 70 more 

Ich weiß, dass Postgres mit großgeschriebenen Tabellennamen etwas nervig ist, aber wie kann ich die Abfrage so ändern, dass sie auf "ADM_TYPES" anstelle von "AdmTypes" zeigt? Sollte dies nicht automatisch geschehen (nachdem ich die Entity-Klasse aus der bestehenden Datenbank erstellt habe)? Was ist falsch an dem Code?

Danke!

+0

Wenn Sie die 'from '"'% "+ Präfix +"% '"' 'entfernen? (Es sieht nicht richtig aus). – esej

+0

Nein, so sollte man einen "wie" Vergleich machen. –

Antwort

10

Postgres (verwendet, nicht sicher auf den neueren) konvertieren Tabellennamen in Kleinbuchstaben. Das ist die bevorzugte Vorgehensweise. Wenn Sie Ihre Abfragen protokollieren, sehen Sie möglicherweise, dass der Ruhezustand Ihren Tabellennamen angibt oder nicht (ich nehme an, dass dies nicht der Fall ist).

Hibernate saving User model to Postgres

Ehrlich gesagt, wenn Sie auf Postgres laufen sollten Sie wirklich entweder configure richtig überwintern, oder, wie ich es aussehen würde, normalisiert Ihre Datenbank als Tabellen keinen Namespace-Konflikt haben sollen (also Entfernen das Problem).

// Aus dem Artikel ...

@Entity 
@Table(name="\"User\"") 
public class User { 
    ... 
} 

07/31/12 EDITED:

Diese Änderung auf die Felder der Tabellen in der folgenden Art und Weise durchgeführt werden müssen:

Für @Column nehmen Sie den Namen der Spalte ändern „entkommen:

@Column(name = "\"C_MODEL\"") 

Für @JoinColumn, ändern Sie den Namen des Spalts Zusatz `:

@JoinColumn(name = "`TP_MODEL`") 

Sie werden es Ihnen Fehler manuell auf den Säulen tun geben.

+0

Ich werde das versuchen und Sie wissen lassen! –

+2

Urk, das ist schrecklich. Hibernate sollte standardmäßig Tabellennamen angeben. Ich würde den Fehler als einen Hibernate-Fehler persönlich betrachten - und wenn es so funktionieren soll, ist es sicherlich ein NetBeans-Modellgenerator-Fehler. –

+0

Sie haben Recht @CraigRinger, es klingt wie ein Fehler und scheint bereits gemeldet zu werden –

Verwandte Themen