2012-07-21 35 views
5

Tôi đang phát triển một ứng dụng sử dụng JPA với Hibernate và Postgresql. Sử dụng thuật sĩ Netbeans, tôi đã tạo các lớp thực thể từ cơ sở dữ liệu hiện có. Các chiết xuất từ ​​một trong các lớp học này là những điều sau đây:Truy vấn Postgresql bằng Hibernate (JPA) không tìm thấy bảng

@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 { 

Trong một EJB tôi có:

@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(); 
    } 

Khi tôi cố gắng thực hiện ModelManagement.listAdmTypesPrefix("APREFIX") Nó tạo ra các lỗi sau:

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 

Tôi biết rằng Postgres là loại khó chịu với tên bảng viết hoa, nhưng làm thế nào tôi có thể thay đổi truy vấn để trỏ đến "ADM_TYPES" thay vì AdmTypes? Điều này không nên được thực hiện tự động (sau khi tất cả tôi đã tạo ra lớp thực thể từ cơ sở dữ liệu hiện có)? Có gì sai với mã?

Cảm ơn!

+0

Nếu bạn xóa tiền tố 'từ '"'% "+ +"% '"'? (Nó không nhìn đúng). – esej

+0

Không, đó là cách thực hiện để thực hiện so sánh "thích". –

Trả lời

10

Postgres (được sử dụng để, không chắc chắn trên mới hơn) chuyển đổi tên bảng thành chữ thường. Đó là quy trình vận hành ưa thích. Nếu bạn đăng nhập truy vấn của bạn, bạn sẽ thấy hibernate có thể hoặc không thể trích dẫn tên bảng của bạn (tôi đoán nó không phải là).

Hibernate saving User model to Postgres

Thành thực mà nói, nếu bạn đang chạy trên Postgres bạn thực sự cần một trong hai cấu hình ngủ đông đúng cách, hoặc, như tôi sẽ nhìn vào nó, bình thường hóa cơ sở dữ liệu của bạn như bảng không nên có một vụ va chạm không gian tên (do đó loại bỏ vấn đề).

// Từ bài viết ...

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

EDITED 07/31/12:

Sự thay đổi này phải được thực hiện đến các lĩnh vực của các bảng theo cách sau:

Đối với @Column, thay đổi tên của cột thêm đã thoát ":

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

Đối @JoinColumn, thay đổi tên của cột thêm `:

@JoinColumn(name = "`TP_MODEL`") 

Bạn sẽ phải làm điều đó bằng tay trên các cột tạo cho bạn lỗi.

+0

Tôi sẽ thử điều này và cho bạn biết! –

+2

Urk, thật kinh khủng. Hibernate nên trích dẫn tên bảng theo mặc định. Tôi muốn xem sự thất bại để làm như vậy như một lỗi Hibernate, cá nhân - và nếu nó được cho là làm việc theo cách này, nó chắc chắn là một lỗi máy phát điện kiểu NetBeans. –

+0

bạn đúng @CraigRinger, có vẻ như đã xảy ra lỗi và dường như đã được báo cáo –

Các vấn đề liên quan