Frage

Ich habe eine 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> 

Kunde.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>
War es hilfreich?

Lösung

Endlich habe ich einen Fehler gefunden!Hoffe, das ist für jemanden nützlich.Wenn Sie eine Anforderung an die Datenbank erfüllen (in meinem Fall apache Derby), muss der Name der Basis den ersten Buchstaben Großbuchstaben in Kleinbuchstaben schreiben.

Dies ist eine falsche Abfrage:

generasacodicetagpre.

Dies ist eine gültige Abfrage

generasacodicetagpre.

und Klasseneinheit muss derselbe Name als Datenbank sein, aber ich bin mir nicht sicher.

Andere Tipps

in hql abfrage, schreiben Sie nicht den Tabellennamen , schreiben Sie Ihren Entity-Klassennamen in Ihre Anfrage wie

generasacodicetagpre.

hibernate.cfg.xml-Datei sollte das Mapping für die folgenden Tabellen haben.Prüfen Sie, ob es in Ihrer Datei fehlt.

generasacodicetagpre.

Wenn Sie die JPA-Anmerkungen verwenden, um die Entitäten zu erstellen, und stellen Sie sicher, dass der Tabellenname zusammen mit @Table Annotation anstelle von @Entity abgebildet wird.

Falsch zugeordnet:

generasacodicetagpre.

richtig zugeordnete Entität:

generasacodicetagpre.

Keiner der anderen Lösung funktionierte für mich.

Selbst wenn ich nicht glaube, dass es die beste Praxis ist, musste ich in den Code hinzufügen so fügen

configuration.addAnnotatedClass(com.myOrg.entities.Person.class);

hier

generasacodicetagpre.

kann sein, dies macht es klarer und macht natürlich auch sinnvoll.

generasacodicetagpre.

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

Ich denke, Hibernate kann Mehrdeutigkeiten bekommen und diese Ausnahme erwirbt, sodass die Lösung den vollständigen qualifizierten Namen (wie com.test.customerv )

nutzen soll

Ich habe diese Antwort hinzugefügt, die in einem Szenario hilft, wie ich erwähnt habe.Ich habe das gleiche Szenario seit einiger Zeit stecken.

Ich habe auch ein ähnliches Problem konfrontiert, als ich anfing, an dem Winterschlaf zu arbeiten.Alles in allem kann ich sagen, dass sich in der CreateQuery den Namen der Entitätsklasse nicht den Tabellennamen angeben muss, in dem die Entität zugeordnet ist.

In meinem Fall mit Spring Data JPA habe ich einfach vergessen, etwas hinzuzufügen nativeQuery = true

@Query( value = "update some_table set some_field_id = null where org_id = :orgId", nativeQuery = true)

Wenn Sie Java zur Konfiguration verwenden, müssen Sie möglicherweise Folgendes überprüfen bean Deklaration, wenn Sie Änderungen auf Paketebene haben.Z.B: com.abc.spring Paket geändert in com.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();
    }

Es bedeutet, dass Ihre Tabelle nicht der JPA zugeordnet ist. Jeder Name des Tisches ist falsch (möglicherweise case sensitive), oder Sie müssen einen Eintrag in die XML-Datei eingeben.

Happy Codierung :)

Andere Personen, die Mapping-Klassen für Hibernate verwenden, stellen sicher, dass sie richtig angesprochen haben Modell einpacken sessionFactory Bean-Deklaration im folgenden Teil:

<property name="packagesToScan" value="com.mblog.model"></property>

Problem wurde teilweise gelöst.Neben der Erstellung von JDBC / Ressourcen (DB-Derby) musste ein JDBC-Anschlusspool für DB-Ressourcen in der Glasfish-Admin-Konsole erstellen und auf Pingen prüfen.Jetzt funktioniert alle CruD-Operation gut.Ich überprüfe, objektkunde in der Datenbank in der Datenbank ordnungsgemäß, ordnungsgemäß, update und löschen.Aber in Glasfisch-Ausgabeprotokoll haben dieselbe Ausnahme:

generasacodicetagpre.

sollte Entity-Klassenname für EM.CREATEQUERY-Methode verwenden oder Sollte em.createativequery-Methode für einheimische Abfrage ohne Entitätsklasse

verwenden

mit Entitätsklasse:

em.createquery ("Select First_Name aus CustomV)

ohne Entitätsklasse oder native Abfrage:

em.createnicativequery ("Select c. first_name von customerv c")

In meinem Fall:Spring Boot 2, mehrere Datenquellen (Standard und benutzerdefiniert). entityManager.createQuery schief gehen:„Entität ist nicht zugeordnet“

Während Debugg finde ich heraus, dass der Unitname des EntityManager falsch ist (sollte individuell sein, aber die Tatsache standardmäßig) richtig:

@PersistenceContext(unitName = "customer1") // !important, 
private EntityManager em;

Die customer1 stammt aus der zweiten Datenquellen-Konfigurationsklasse:

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

Dann hat der EntityManager Recht.

Aber em.persist(entity) funktioniert nicht und die Transaktion funktioniert nicht.

Ein weiterer wichtiger Punkt ist:

@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 stammt aus der zweiten Datenquellen-Konfigurationsklasse:

@Bean(name = "customer1TransactionManager")
public PlatformTransactionManager transactionManager(
        @Qualifier("customer1EntityManagerFactory") EntityManagerFactory entityManagerFactory) {
    return new JpaTransactionManager(entityManagerFactory);
}

Die gesamte zweite Datenquellen-Konfigurationsklasse lautet:

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

in Apache Derby dB, verzichten Sie auf Tabellennamen als "Benutzer" oder so, da sie auf dem Apache Derby reserviert sind, aber auf MySQL fein arbeiten werden.

In der Abfrage müssen Sie den Namen der Entitätsklasse angeben, dass Sie die Daten aus der Klausel der Abfrage abrufen möchten.

generasacodicetagpre.

Hier ist der Benutzer der Name meiner Java-Entitätsklasse (überlegen Sie das Gehäuse des Namens, wie in Java es ist wichtig.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top