Saya punya contoh aplikasi web Hibernate 4.3.5 + database Derby 10.10.1.1+ Glassfish4.0 dengan IDE NetBeans 8.0Beta.
Saya memiliki pengecualian berikutnya:
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
Formulir dari 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
sumber
sumber
di kueri HQL , Jangan tulis nama Tabel , tulis nama kelas Entitas Anda di kueri Anda seperti
String s = "from Entity_class name"; query qry = session.createUqery(s);
sumber
Dalam kasus saya, saya hanya lupa menambahkan
nativeQuery = true
@Query( value = "some sql query ...", nativeQuery = true)
Untuk Spring Boot dengan Spring Data JPA
sumber
File hibernate.cfg.xml harus memiliki pemetaan untuk tabel seperti di bawah ini. Periksa apakah tidak ada di file Anda.
...... <hibernate-configuration> ...... ...... <session-factory> ...... <mapping class="com.test.bean.dbBean.testTableHibernate"/> ...... </session-factory> </hibernate-configuration> .....
sumber
Jika Anda menggunakan anotasi JPA untuk membuat entitas, lalu pastikan nama tabel dipetakan bersama dengan anotasi @Table, bukan @Entity.
Dipetakan dengan salah:
@Entity(name="DB_TABLE_NAME") public class DbTableName implements Serializable { .... .... }
Entitas yang dipetakan dengan benar:
@Entity @Table(name="DB_TABLE_NAME") public class DbTableName implements Serializable { .... .... }
sumber
Mungkin ini akan membuatnya lebih jelas, dan tentu saja masuk akal juga.
@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 { ... }
sumber
Ada satu kesempatan lagi untuk mendapatkan pengecualian ini meskipun kami menggunakan nama kelas, yaitu jika kami memiliki dua kelas dengan nama yang sama dalam paket yang berbeda. kami akan mendapatkan masalah ini.
Saya pikir hibernate mungkin mendapatkan ambiguitas dan melempar pengecualian ini, jadi solusinya adalah menggunakan nama lengkap yang memenuhi syarat (seperti com.test.Customerv )
Saya menambahkan jawaban ini yang akan membantu dalam skenario seperti yang saya sebutkan. Saya mendapat skenario yang sama macet untuk beberapa waktu.
sumber
Tidak ada solusi lain yang berhasil untuk saya.
Bahkan jika menurut saya ini bukan praktik terbaik, saya harus menambahkannya ke dalam kode seperti ini
configuration.addAnnotatedClass(com.myOrg.entities.Person.class);
sini
public static SessionFactory getSessionFactory() { Configuration configuration = new Configuration().configure(); configuration.addAnnotatedClass(com.myOrg.entities.Person.class); StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder() .applySettings(configuration.getProperties()); SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build()); return sessionFactory; }
sumber
Saya juga menghadapi masalah serupa ketika saya mulai mengerjakan Hibernate. Semua di dalam semua yang bisa saya katakan ada di createQuery, seseorang harus meneruskan nama kelas entitas bukan nama tabel tempat entitas dipetakan.
sumber
Artinya tabel Anda tidak dipetakan ke JPA. Salah satu Nama tabel salah (Mungkin peka huruf besar / kecil), atau Anda perlu memasukkan entri di file XML.
Selamat Coding :)
sumber
Orang lain yang menggunakan kelas pemetaan untuk Hibernate, pastikan bahwa telah ditujukan dengan benar ke paket model di
sessionFactory
deklarasi kacang di bagian berikut:<property name="packagesToScan" value="com.mblog.model"></property>
sumber
packages-to-scan
sayaapplication.yml
.Jika Anda kebetulan menggunakan java untuk konfigurasi, Anda mungkin perlu memeriksa
bean
deklarasi di bawah ini jika Anda memiliki perubahan level paket. Misal:com.abc.spring
paket diubah menjadicom.bbc.spring
@Bean public SessionFactory sessionFactory() { LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource()); //builder.scanPackages("com.abc.spring"); //Comment this line as this package no longer valid. builder.scanPackages("com.bbc.spring"); builder.addProperties(getHibernationProperties()); return builder.buildSessionFactory(); }
sumber
Dalam kasus saya: boot musim semi 2, beberapa sumber data (default dan kustom).
entityManager.createQuery
salah: 'entitas tidak dipetakan'saat debug, saya menemukan bahwa unitName entityManager salah (harus custom, tetapi faktanya default) dengan cara yang benar:
@PersistenceContext(unitName = "customer1") // !important, private EntityManager em;
yang
customer1
berasal dari kedua kelas sumber data config:@Bean(name = "customer1EntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("customer1DataSource") DataSource dataSource) { return builder.dataSource(dataSource).packages("com.xxx.customer1Datasource.model") .persistenceUnit("customer1") // PersistenceUnit injects an EntityManagerFactory, and PersistenceContext // injects an EntityManager. // It's generally better to use PersistenceContext unless you really need to // manage the EntityManager lifecycle manually. // 【4】 .properties(jpaProperties.getHibernateProperties(new HibernateSettings())).build(); }
Kemudian, entityManager benar.
Tapi, em.persist (entity) tidak berfungsi, dan transaksi tidak berfungsi.
Poin penting lainnya adalah:
@Transactional("customer1TransactionManager") // !important public Trade findNewestByJdpModified() { //test persist,working right! Trade t = new Trade(); em.persist(t); log.info("t.id" + t.getSysTradeId()); //test transactional, working right! int a = 3/0; }
customer1TransactionManager
berasal dari kelas konfigurasi sumber data kedua:@Bean(name = "customer1TransactionManager") public PlatformTransactionManager transactionManager( @Qualifier("customer1EntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); }
Seluruh kelas konfigurasi sumber data kedua adalah:
package com.lichendt.shops.sync; import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement @EnableJpaRepositories(entityManagerFactoryRef = "customer1EntityManagerFactory", transactionManagerRef = "customer1TransactionManager", // 【1】这里写的是DAO层的路径 ,如果你的DAO放在 com.xx.DAO下面,则这里写成 com.xx.DAO basePackages = { "com.lichendt.customer1Datasource.dao" }) public class Custom1DBConfig { @Autowired private JpaProperties jpaProperties; @Bean(name = "customer1DatasourceProperties") @Qualifier("customer1DatasourceProperties") @ConfigurationProperties(prefix = "customer1.datasource") public DataSourceProperties customer1DataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "customer1DataSource") @Qualifier("customer1DatasourceProperties") @ConfigurationProperties(prefix = "customer1.datasource") // // 【2】datasource配置的前缀,对应上面 【mysql的yaml配置】 public DataSource dataSource() { // return DataSourceBuilder.create().build(); return customer1DataSourceProperties().initializeDataSourceBuilder().build(); } @Bean(name = "customer1EntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("customer1DataSource") DataSource dataSource) { return builder.dataSource(dataSource).packages("com.lichendt.customer1Datasource.model") // 【3】这里是实体类的包路径 .persistenceUnit("customer1") // PersistenceUnit injects an EntityManagerFactory, and PersistenceContext // injects an EntityManager. // It's generally better to use PersistenceContext unless you really need to // manage the EntityManager lifecycle manually. // 【4】 .properties(jpaProperties.getHibernateProperties(new HibernateSettings())).build(); } @Bean(name = "customer1TransactionManager") public PlatformTransactionManager transactionManager( @Qualifier("customer1EntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } }
sumber
Masalah terpecahkan sebagian. Selain membuat jdbc / resource (DB Derby) harus membuat JDBC Connection Pool untuk resource db di konsol admin Glassfish, dan memeriksanya di ping. Sekarang semua operasi CRUD bekerja dengan baik. Saya periksa, objek Pelanggan dalam database menambahkan dengan benar, perbarui dan hapus juga. Tetapi dalam log keluaran Glassfish memiliki pengecualian yang sama:
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)
sumber
Harus menggunakan nama kelas Entitas untuk metode em.createQuery atau Harus menggunakan metode em.createNativeQuery untuk kueri asli tanpa kelas entitas
Dengan kelas Entitas:
em.createQuery ("pilih first_name dari CUSTOMERV")
Tanpa kelas Entitas atau kueri Asli:
em.createNativeQuery ("pilih c.first_name dari CUSTOMERV c")
sumber
Di Apache Derby DB, jangan menggunakan nama tabel sebagai "pengguna" atau lebih karena kata kunci tersebut dicadangkan di Apache Derby tetapi akan berfungsi dengan baik di MySql.
Dalam Kueri, Anda harus menentukan nama kelas Entitas tempat Anda ingin mengambil datanya di klausa FROM dari Kueri.
List<User> users=session.createQuery("from User").list();
Di sini, Pengguna adalah nama kelas Entitas Java saya (Pertimbangkan casing nama seperti di Java itu penting.)
sumber
Solusi lain yang berhasil:
Objek akses data yang sebenarnya melontarkan pengecualian ini adalah
public List<Foo> findAll() { return sessionFactory.getCurrentSession().createQuery("from foo").list(); }
Kesalahan yang saya lakukan pada potongan di atas adalah bahwa saya telah menggunakan nama tabel foo di dalam createQuery. Sebagai gantinya, saya harus menggunakan Foo, nama kelas yang sebenarnya.
public List<Foo> findAll() { return sessionFactory.getCurrentSession().createQuery("from Foo").list();
Terima kasih untuk blog ini: https://www.arundhaj.com/blog/querysyntaxexception-not-mapped.html
sumber
Orang lain yang menggunakan kelas pemetaan untuk Hibernate, pastikan bahwa telah ditujukan dengan benar ke paket model di deklarasi kacang sessionFactory di bagian berikut:
public List<Book> list() { List<Book> list=SessionFactory.getCurrentSession().createQuery("from book").list(); return list; }
Kesalahan yang saya lakukan pada potongan di atas adalah bahwa saya telah menggunakan nama tabel foo di dalam createQuery. Sebagai gantinya, saya harus menggunakan Foo, nama kelas yang sebenarnya.
public List<Book> list() { List<Book> list=SessionFactory.getCurrentSession().createQuery("from Book").list(); return list; }
sumber
tambahkan parameter nativeQuery = true
contoh: @Query (value = "Perbarui kumpulan pengguna nama_user =: nama_pengguna, kata sandi =: kata sandi di mana user_id =: user_id", nativeQuery = true)
sumber