2014-04-11 17 views
38

Tôi có ứng dụng web ví dụ Hibernate 4.3.5 + Cơ sở dữ liệu Derby 10.10.1.1+ Glassfish4.0 với IDE NetBeans 8.0Beta.org.hibernate.hql.internal.ast.QuerySyntaxException: bảng không được ánh xạ

Tôi có ngoại lệ tiếp theo:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped 
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189) 
at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109) 
at org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:95) 
at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:331) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3633) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3522) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299) 
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:278) 
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:206) 
... 72 more 

Mẫu từ index.xhtml

<h:panelGrid id="panel1" columns="2" border="1" 
       cellpadding="5" cellspacing="1"> 
     <f:facet name="header"> 
      <h:outputText value="Add Customer Information"/> 
     </f:facet> 
     <h:outputLabel value="First Name:"/> 
     <h:inputText value="#{customer.firstName}" id="fn"/> 
     <h:outputLabel value="Last Name:"/> 
     <h:inputText value="#{customer.lastName}" id="ln"/> 
     <h:outputLabel value="Email:"/> 
     <h:inputText value="#{customer.email}" id="eml"/> 
     <h:outputLabel value="Date of Birth:"/> 
     <h:inputText value="#{customer.sd}" id="s"/> 
     <f:facet name="footer"> 
      <h:outputLabel value="#{customer.msg}" id="msg" styleClass="msg"/> 
      <h:commandButton value="Save" action="#{customer.saveCustomer}"> 
      </h:commandButton> 
     </f:facet> 
    </h:panelGrid> 

Customer.java

package com.javaknowledge.entity; 

    import com.javaknowledge.dao.CustomerDao; 
    import java.text.ParseException; 
    import java.text.SimpleDateFormat; 
    import java.util.ArrayList; 
    import java.util.Date; 
    import java.util.List; 
    import javax.faces.bean.ManagedBean; 
    import javax.faces.bean.SessionScoped; 
    import javax.persistence.*;  

    @ManagedBean 
    @SessionScoped 

    public class Customer implements java.io.Serializable { 

    private Integer custId; 
    private String firstName; 
    private String lastName; 
    private String email; 
    private Date dob; 
    private String sd, msg, selectedname; 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 


    public Customer() { 
    } 

    public Customer(String firstName, String lastName, String email, Date dob) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.email = email; 
     this.dob = dob; 
    } 

    public String getSd() { 
     return sd; 
    } 

    public void setSd(String sd) { 
     this.sd = sd; 
    } 

    public Integer getCustId() { 
     return this.custId; 
    } 

    public void setCustId(Integer custId) { 
     this.custId = custId; 
    } 

    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
    @Column(name = "EMAIL") 
    public String getEmail() { 
     return this.email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    @Column(name = "DOB") 
    public Date getDob() { 
     return this.dob; 
    } 

    public void setDob(Date dob) { 
     this.dob = dob; 
    } 

    public String getMsg() { 
     return msg; 
    } 

    public void setMsg(String msg) { 
     this.msg = msg; 
    } 

    public String getSelectedname() { 
     return selectedname; 
    } 

    public void setSelectedname(String selectedname) { 
     this.selectedname = selectedname; 
    } 

    public void saveCustomer() { 
     try { 
      Date d = sdf.parse(sd); 
      System.out.println(d); 
      this.dob = d; 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     CustomerDao dao = new CustomerDao(); 
     dao.addCustomer(this); 
     this.msg = "Member Info Saved Successfull!"; 
     clearAll(); 
    } 
    public void updateCustomer() { 
     try { 
      Date d = sdf.parse(sd); 
      System.out.println(d); 
      this.dob = d; 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
     CustomerDao dao = new CustomerDao(); 
     dao.updateCustomer(this); 
     this.msg = "Member Info Update Successfull!"; 
     clearAll(); 
    } 
    public void deleteCustomer() { 
     CustomerDao dao = new CustomerDao(); 
     dao.deleteCustomer(custId); 
     this.msg = "Member Info Delete Successfull!"; 
     clearAll(); 
    } 

    public List<Customer> getAllCustomers() { 
     List<Customer> users = new ArrayList<Customer>(); 
     CustomerDao dao = new CustomerDao(); 
     users = dao.getAllCustomers(); 
     return users; 
    } 

    public void fullInfo() { 
     CustomerDao dao = new CustomerDao(); 
     List<Customer> lc = dao.getCustomerById(selectedname); 
     System.out.println(lc.get(0).firstName); 
     this.custId = lc.get(0).custId; 
     this.firstName = lc.get(0).firstName; 
     this.lastName = lc.get(0).lastName; 
     this.email = lc.get(0).email; 
     this.dob = lc.get(0).dob; 
     this.sd = sdf.format(dob); 
    } 

    private void clearAll() { 
     this.firstName = ""; 
     this.lastName = ""; 
     this.sd = ""; 
     this.email = ""; 
     this.custId=0; 
    } 

    } 

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.DerbyDialect</property> 
    <property name="hibernate.connection.driver_class">org.apache.derby.jdbc.ClientDriver</property> 
    <property name="hibernate.connection.url">jdbc:derby://localhost:1527/derbyDB</property> 
    <property name="hibernate.connection.username">user1</property> 
    <property name="hibernate.connection.password">user1</property> 
    <property name="hibernate.hbm2ddl.auto">create</property> 

    <property name="c3p0.min_size">1</property> 
    <property name="c3p0.max_size">5</property> 
    <property name="c3p0.timeout">300</property> 
    <property name="c3p0.max_statements">50</property> 
    <property name="c3p0.idle_test_period">300</property> 

    <mapping class="com.javaknowledge.entity.Customer" resource="com/javaknowledge/entity/Customer.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

Customer.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
    <class name="com.javaknowledge.entity.Customer" table="CUSTOMERV" schema="APP"> 
     <id name="custId" type="java.lang.Integer"> 
      <column name="cust_id" /> 
      <generator class="increment" /> 
     </id> 
     <property name="firstName" type="string"> 
      <column name="first_name" length="45" not-null="true" /> 
     </property> 
     <property name="lastName" type="string"> 
      <column name="last_name" length="45" not-null="true" /> 
     </property> 
     <property name="email" type="string"> 
      <column name="email" length="45" not-null="true" /> 
     </property> 
     <property name="dob" type="date"> 
      <column name="dob" length="10" not-null="true" /> 
     </property> 
    </class> 
</hibernate-mapping> 

Trả lời

57

Cuối cùng tôi tìm thấy một sai lầm! Hy vọng điều này rất hữu ích cho ai đó. Khi thực hiện một yêu cầu tới cơ sở dữ liệu (trong trường hợp của tôi là Apache Derby), tên của cơ sở cần viết chữ hoa đầu tiên trên trường hợp khác trong trường hợp thấp hơn.

Đây là sai truy vấn:

session.createQuery("select first_name from CUSTOMERV"). 

này có giá trị truy vấn

session.createQuery("select first_name from Customerv"). 

Và tổ chức lớp phải cùng tên như cơ sở dữ liệu, nhưng tôi không chắc chắn.

+15

Điều đó có thể không phải là lý do. Chọn c từ khách hàng c này là truy vấn tốt như khách hàng là bạn tên lớp và chúng ta nên viết tên lớp trong các truy vấn không phải là bảng name.Another điều trong hibernate.cfg.xml của bạn, bạn đã cho cả chỉ có một sẽ ổn thôi. Hãy kiểm tra với điều đó. –

+0

Cảm ơn lời khuyên Shoalib Chikate! –

+0

Vui lòng hướng dẫn trên http://stackoverflow.com/questions/35657292/invocation-of-init-method-failed-nested-exception-is-java-lang-illegalargumente – Prateek

0

Vấn đề đã được giải quyết phần nào. Bên cạnh việc tạo ra jdbc/resource (DB Derby) đã tạo ra JDBC Connection Pool cho tài nguyên db trong giao diện quản trị Glassfish, và kiểm tra nó trên ping. Bây giờ tất cả các hoạt động CRUD hoạt động tốt. Tôi kiểm tra, đối tượng khách hàng trong cơ sở dữ liệu thêm đúng, cập nhật và xóa quá. Nhưng trong nhật ký sản lượng Glassfish có cùng ngoại lệ:

SEVERE: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped [select concat(first_name, ' ', last_name) as name from CUSTOMERV] 
    at org.hibernate.hql.internal.ast.QuerySyntaxException.generateQueryException(QuerySyntaxException.java:96) 
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:120) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:234) 
    ....... 

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: CUSTOMERV is not mapped 
    at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:189) 
    at org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:109) 
2

Có thể điều này sẽ làm cho nó rõ ràng hơn và tất nhiên cũng có ý nghĩa.

@Entity 
@Table(name = "users") 

/** 
* 
* @author Ram Srinvasan 
* Use class name in NamedQuery 
* Use table name in NamedNativeQuery 
*/ 
@NamedQueries({ @NamedQuery(name = "findUserByName", query = "from User u where u.name= :name") }) 

@NamedNativeQueries({ @NamedNativeQuery(name = "findUserByNameNativeSQL", query = "select * from users u where u.name= :name", resultClass = User.class) }) 
public class User implements Principal { 
... 
} 
1

Có thêm một cơ hội để ngoại lệ này ngay cả khi chúng tôi sử dụng tên lớp tức là nếu chúng tôi có hai lớp có cùng tên trong các gói khác nhau. chúng ta sẽ gặp vấn đề này.

Tôi nghĩ rằng ngủ đông có thể nhận được sự mơ hồ và ném ngoại lệ này, vì vậy giải pháp là sử dụng tên đủ điều kiện đầy đủ (như com.test.Customerv)

tôi thêm câu trả lời này sẽ giúp trong tình huống như tôi đã đề cập . Tôi nhận được kịch bản tương tự đã bị mắc kẹt trong một thời gian.

6

tệp hibernate.cfg.xml phải có ánh xạ cho các bảng như dưới đây. Kiểm tra xem nó có bị thiếu trong tệp của bạn không.

...... 
<hibernate-configuration> 
...... 
...... 
    <session-factory> 
...... 
<mapping class="com.test.bean.dbBean.testTableHibernate"/> 
...... 
</session-factory> 

</hibernate-configuration> 
..... 
+0

này là trường hợp đối với tôi, trong khi thay đổi thực hiện để làm việc với Oracle DB thay vì Derby - với Derby, đối với một số lý do, tuyên bố thực thể trong persistence.xml là không cần thiết (nó có vẻ logic với tôi, kể từ khi các đơn vị đã được chú thích) (có lẽ đó là vì một trình điều khiển cũ hơn (ojdbc6)) –

1

trong HQL truy vấn không ghi tên bảng viết tên lớp thực thể của bạn trong truy vấn của bạn như String s = "từ tên entity_cllass"; truy vấn qry = session.createUqery (s);

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