Ich habe Beispiel Webanwendung Hibernate 4.3.5 + Derby-Datenbank 10.10.1.1+ Glassfish4.0 mit IDE NetBeans 8.0Beta.
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>
java
hibernate
derby
glassfish-4
Vlad Dobrydin
quelle
quelle
Schreiben Sie in der HQL- Abfrage nicht den Tabellennamen , sondern den Namen Ihrer Entitätsklasse in Ihre Abfrage wie
quelle
In meinem Fall habe ich nur vergessen hinzuzufügen
nativeQuery = true
Für Spring Boot mit Spring Data JPA
quelle
Die Datei hibernate.cfg.xml sollte die Zuordnung für die folgenden Tabellen haben. Überprüfen Sie, ob es in Ihrer Datei fehlt.
quelle
Wenn Sie die JPA-Annotationen zum Erstellen der Entitäten verwenden und dann sicherstellen, dass der Tabellenname zusammen mit der @ Table-Annotation anstelle von @Entity zugeordnet wird.
Falsch zugeordnet:
Richtig zugeordnetes Objekt:
quelle
Vielleicht wird dies klarer und macht natürlich auch Sinn.
quelle
Es gibt noch eine Chance, diese Ausnahme zu erhalten, selbst wenn wir den Klassennamen verwendet haben, dh wenn wir zwei Klassen mit demselben Namen in verschiedenen Paketen haben. Wir werden dieses Problem bekommen.
Ich denke, der Ruhezustand kann zu Mehrdeutigkeiten führen und diese Ausnahme auslösen. Daher besteht die Lösung darin, einen vollständig qualifizierten Namen zu verwenden (wie com.test.Customerv ).
Ich habe diese Antwort hinzugefügt, die im Szenario helfen wird, wie ich bereits erwähnt habe. Ich habe das gleiche Szenario für einige Zeit stecken.
quelle
Keine der anderen Lösungen hat bei mir funktioniert.
Auch wenn ich seine die beste Praxis nicht denken, musste ich es in den Code hinzufügen , wie diese
configuration.addAnnotatedClass(com.myOrg.entities.Person.class);
Hier
quelle
Auch ich hatte ein ähnliches Problem, als ich anfing, an Hibernate zu arbeiten. Alles in allem kann ich sagen, dass in der createQuery der Name der Entitätsklasse übergeben werden muss, nicht der Tabellenname, dem die Entität zugeordnet ist.
quelle
Dies bedeutet, dass Ihre Tabelle nicht der JPA zugeordnet ist. Entweder ist der Name der Tabelle falsch (möglicherweise wird zwischen Groß- und Kleinschreibung unterschieden), oder Sie müssen einen Eintrag in die XML-Datei einfügen.
Viel Spaß beim Codieren :)
quelle
Andere Personen, die Zuordnungsklassen für den Ruhezustand verwenden, stellen sicher, dass sie im folgenden Teil korrekt an das Modellpaket in der
sessionFactory
Bean-Deklaration adressiert haben :quelle
packages-to-scan
meineapplication.yml
Konfigurationsdatei zu ändern .Wenn Sie Java zufällig für die Konfiguration verwenden, müssen Sie möglicherweise die folgende
bean
Deklaration überprüfen, wenn Sie Änderungen auf Paketebene haben. ZB:com.abc.spring
Paket geändert incom.bbc.spring
quelle
Problem wurde teilweise gelöst. Neben dem Erstellen von jdbc / resource (DB Derby) musste der JDBC-Verbindungspool für die db-Ressource in der Glassfish-Administratorkonsole erstellt und beim Ping überprüft werden. Jetzt funktionieren alle CRUD-Operationen einwandfrei. Ich überprüfe, Objekt Kunde in Datenbank ordnungsgemäß hinzufügen, aktualisiere und lösche auch. Im Ausgabeprotokoll von Glassfish gilt jedoch dieselbe Ausnahme:
quelle
Sollte den Entitätsklassennamen für die em.createQuery-Methode verwenden oder sollte die em.createNativeQuery-Methode für native Abfragen ohne Entitätsklasse verwenden
Mit Entitätsklasse:
em.createQuery ("Vorname aus CUSTOMERV auswählen")
Ohne Entitätsklasse oder native Abfrage:
em.createNativeQuery ("Wählen Sie c.first_name aus CUSTOMERV c")
quelle
In meinem Fall: Spring Boot 2, mehrere Datenquellen (Standard und benutzerdefiniert).
entityManager.createQuery
schief gehen: 'Entität ist nicht zugeordnet'Beim Debuggen stelle ich fest, dass der unitName des entityManager falsch ist (sollte benutzerdefiniert sein, aber die Tatsache ist Standard).
Das
customer1
ist aus der zweiten Datenquellen-Konfigurationsklasse:Dann ist der entityManager richtig.
Em.persist (Entität) funktioniert jedoch nicht und die Transaktion funktioniert nicht.
Ein weiterer wichtiger Punkt ist:
customer1TransactionManager
stammt aus der zweiten Datenquellen-Konfigurationsklasse:Die gesamte zweite Datenquellen-Konfigurationsklasse lautet:
quelle
Verwenden Sie in Apache Derby DB keine Tabellennamen als "Benutzer", da diese in Apache Derby reservierte Schlüsselwörter sind, in MySql jedoch einwandfrei funktionieren.
In der Abfrage müssen Sie den Namen der Entitätsklasse, von der Sie die Daten abrufen möchten, in der FROM-Klausel der Abfrage angeben.
Hier ist Benutzer der Name meiner Java-Entitätsklasse (Betrachten Sie die Schreibweise des Namens, wie es in Java wichtig ist.)
quelle
Eine andere Lösung, die funktioniert hat:
Das Datenzugriffsobjekt, das diese Ausnahme tatsächlich ausgelöst hat, ist
Der Fehler, den ich im obigen Snippet gemacht habe, ist, dass ich den Tabellennamen foo in createQuery verwendet habe. Stattdessen muss ich Foo verwenden, den tatsächlichen Klassennamen.
Dank dieses Blogs: https://www.arundhaj.com/blog/querysyntaxexception-not-mapped.html
quelle
Andere Personen, die Zuordnungsklassen für den Ruhezustand verwenden, stellen sicher, dass sie das Modellpaket in der sessionFactory-Bean-Deklaration im folgenden Teil korrekt adressiert haben:
Der Fehler, den ich im obigen Snippet gemacht habe, ist, dass ich den Tabellennamen foo in createQuery verwendet habe. Stattdessen muss ich Foo verwenden, den tatsächlichen Klassennamen.
quelle