2014-04-11 12 views
38

Ich habe Beispiel Web-Anwendung Hibernate 4.3.5 + Derby-Datenbank 10.10.1.1 + Glassfish4.0 mit IDE NetBeans 8.0Beta.org.hibernate.hql.internal.ast.QuerySyntaxException: Tabelle ist nicht zugeordnet

Ich habe die nächste Ausnahme:

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 

Formular aus 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> 

Antwort

57

Schließlich fand ich einen Fehler! Hoffe das ist für jemanden nützlich. Bei einer Anfrage an die Datenbank (in meinem Fall Apache Derby) muss der Name der Basis den ersten Großbuchstaben des anderen Großbuchstabens schreiben.

Dieses falsche Abfrage:

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

Dies gilt Abfrage

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

und Klassen Einheit gleichen Namen wie Datenbank sein muss, aber ich bin nicht sicher.

+15

Das kann nicht der Grund sein. Wählen Sie c aus Kunde c Dies ist eine gute Abfrage als Kunde ist Ihr Klassenname und wir sollten den Klassennamen in die Abfrage schreiben, nicht den Tabellennamen. Eine andere Sache in Ihrer hibernate.cfg.xml haben Sie sowohl nur eine gegeben wäre in Ordnung. Bitte überprüfe das. –

+0

Danke für den Rat Shoalib Chikate! –

+0

Bitte führen Sie auf http://stackoverflow.com/questions/35657292/invocation-of-init-method-failed-nested-exception-is-java-lang-illegalargumente – Prateek

0

Problem wurde teilweise gelöst. Neben dem Erstellen von jdbc/resource (DB Derby) musste JDBC Connection Pool für die db-Ressource in der Glassfish-Verwaltungskonsole erstellt und beim Pingen überprüft werden. Jetzt funktionieren alle CRUD-Operationen einwandfrei. Ich überprüfe, ob Kunde in der Datenbank korrekt hinzugefügt, aktualisiert und auch gelöscht wird. Aber in Glassfish Ausgabeprotokoll haben gleiche Ausnahme:

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

Vielleicht wird es dadurch klarer und natürlich auch sinnvoll.

1

Es gibt noch eine Chance, diese Ausnahme zu bekommen, auch wenn wir Klassennamen verwendet haben, d. H. Wenn wir zwei Klassen mit demselben Namen in verschiedenen Paketen haben. Wir werden dieses Problem bekommen.

denke ich Hibernate Mehrdeutigkeit bekommen kann und wirft diese Ausnahme, so dass die Lösung vollständig qualifizierte Namen verwenden (wie com.test.Customerv)

ich diese Antwort hinzugefügt, die im Szenario helfen wie ich bereits erwähnt . Ich habe das gleiche Szenario für einige Zeit steckengeblieben.

6

hibernate.cfg.xml Datei sollte die Zuordnung für die Tabellen wie folgt haben. Überprüfen Sie, ob es in Ihrer Datei fehlt.

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

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

Dies war der Fall für mich, während die Implementierung geändert wurde, um mit Oracle DB anstelle von Derby zu arbeiten - mit Derby, aus irgendeinem Grund, Deklarationen von Entitäten in persistence.xml war nicht notwendig (es erschien mir logisch, da Entitäten bereits kommentiert wurden) (vielleicht lag das an einem älteren Treiber (ojdbc6)) –

1

in HQL Abfrage nicht der Tabellenname Ihre Unternehmen Klassennamen in der Abfrage wie String s = „von entity_cllass Namen“ schreiben schreibt; Abfrage qry = session.createUqery (s);