المؤسسة.السبات.هقل.داخلي.أست.كيريسينتاكسيكسيبتيون:لم يتم تعيين الجدول

StackOverflow https://stackoverflow.com//questions/23018836

سؤال

لدي مثال تطبيق ويب السبات 4.3.5 + قاعدة بيانات ديربي 10.10.1.1 + غلاسفيش 4.0 مع إيد نيتبانز 8.0 بيتا.

لدي الاستثناء التالي:

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 

شكل من الفهرس.شتمل

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

زبون.جافا

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

   }

السبات.(سي إف جي).شمل

<?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>

زبون.إتش بي إم.شمل

<?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>
هل كانت مفيدة؟

المحلول

أخيرا وجدت خطأ!نأمل أن يكون هذا مفيد لشخص ما.عند القيام بطلب إلى قاعدة البيانات (في حالتي، فإن Apache Derby)، اسم الأساس تحتاج كتابة الحرف العليا الحرف الأول في الحالة الصغيرة.

هذا استعلام خاطئ:

giveacodicetagpre.

هذا استعلام صالح

giveacodicetagpre. يجب أن يكون

وكيان الطبقة نفس اسم قاعدة البيانات، لكنني لست متأكدا.

نصائح أخرى

في hql الاستعلام، لا تكتب اسم الجدول ، اكتب اسم فئة كيان كيان في استعلامك

giveacodicetagpre.

يجب أن يحتوي ملف Hibernate.cfg.xml على تعيين جداول الجدولين أدناه.تحقق مما إذا كان مفقودا في ملفك.

giveacodicetagpre.

إذا كنت تستخدم التعليقات التوضيحية JPA لإنشاء الكيانات، ثم تأكد من تعيين اسم الجدول مع التوضيحية القابلة للتغيير بدلا من entity.

المعينة بشكل غير صحيح:

giveacodicetagpre.

كيان معين بشكل صحيح:

giveacodicetagpre.

لم ينجح أي من الحلول الأخرى بالنسبة لي.

حتى لو كنت لا أعتقد أن أفضل الممارسات ، كان علي أن إضافته إلى التعليمات البرمجية مثل هذا

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

هنا

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

قد يكون هذا سيجعله أكثر وضوحا، وبالطبع المنطقي أيضا.

giveacodicetagpre.

هناك فرصة أخرى للحصول على هذا الاستثناء حتى لو استخدمنا اسم الفئة، أي إذا كان لدينا فئتان لهما نفس الاسم في حزم مختلفة.سنحصل على هذه المشكلة.

أعتقد أن السبات قد يحصل على الغموض ويطرح هذا الاستثناء، وبالتالي فإن الحل هو استخدام الاسم المؤهل الكامل (مثل com.test.Customerv)

أضفت هذه الإجابة التي ستساعد في السيناريو كما ذكرت.حصلت على نفس السيناريو عالقا لبعض الوقت.

أنا أيضا واجهت مشكلة مماثلة عندما بدأت في العمل على السبات.كل ذلك في كل ما يمكنني قوله هو في المخلر، يحتاج المرء إلى تمرير اسم فئة الكيان وليس اسم الجدول الذي يتم تعيين الكيان إليه.

في حالتي مع بيانات الربيع جبا أنا فقط نسيت أن أضيف nativeQuery = true

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

إذا كنت من قبل أي فرصة باستخدام جافا للتكوين ، قد تحتاج إلى التحقق من أدناه bean إعلان إذا كان لديك تغييرات مستوى الحزمة.على سبيل المثال: com.abc.spring تم تغيير الحزمة إلى 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();
    }

يعني أنه لم يتم تعيين طاولتك إلى JPA. إما اسم الجدول خاطئ (ربما حساس لحالة الأحرف)، أو تحتاج إلى وضع إدخال في ملف XML.

الترميز السعيد :)

الأشخاص الآخرين الذين يستخدمون رسائل رسم الخرائط لسبات السبات، تأكد من معالجة بشكل صحيح إلى نموذج في إعلان الفاصوليا في الجزء التالي:

giveacodicetagpre.

مشكلة

تم حلها جزئيا.إلى جانب إنشاء JDBC / Resource (DB Derby)، اضطر إلى إنشاء تجمع اتصال JDBC لمورد DB في وحدة التحكم في إدارة إدارة Glassfish، والتحقق من ذلك على Pinging.الآن جميع عمليات Crud تعمل بشكل جيد.أتحقق من كائن العميل في قاعدة البيانات مضيفا بشكل صحيح وتحديث وحذف أيضا.ولكن في سجل إخراج Glassfish لها نفس الاستثناء:

giveacodicetagpre.

يجب استخدام

اسم فئة الكيان لطريقة EM.Createquery أو يجب استخدام طريقة EM.CreateCeriquery للاستعلام الأصلي بدون فئة كيكة

مع فئة الكيان:

em.createquery ("حدد first_name من التخصصات")

بدون فئة كيكة أو استعلام أصلي:

em.createCentiquery ("حدد c.first_name من التخصصي c")

في حالتي:التمهيد الربيع 2 ، مصدر بيانات متعددة (الافتراضي والعرف). entityManager.createQuery تسوء:'لم يتم تعيين الكيان'

في حين التصحيح ، أجد أن ونيتنام إنتيتيماناجر هو الخطأ (يجب أن تكون مخصصة ، ولكن الحقيقة هي الافتراضي) الطريق الصحيح:

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

ال customer1 هو من فئة تكوين مصدر البيانات الثانية:

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

ثم ، إنتيتيماناجر هو الصحيح.

ولكن ، إم.استمرار (الكيان) لا يعمل ، والمعاملة لا تعمل.

نقطة أخرى مهمة هي:

@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 هو من فئة تكوين مصدر البيانات الثانية:

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

فئة تكوين مصدر البيانات الثانية بأكملها هي :

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

في Apache Derby DB، الامتناع عن استخدام أسماء الجدول ك "مستخدم" أو نحو ذلك لأنها كلمات رئيسية محفوظة على Derby Apache ولكنها ستعمل بشكل جيد على MySQL.

في الاستعلام، يجب عليك تحديد اسم فئة الكيان التي تريد إحضار البيانات من خلال جملة الاستعلام.

giveacodicetagpre.

هنا، المستخدم هو اسم فئة كيان Java الخاص بي (فكر في غلاف الاسم كما هو الحال في Java IT يهم.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top