হাইবারনেট ত্রুটি - ক্যোরিসাইন্টেক্স এক্সেপশন: ব্যবহারকারীরা [ব্যবহারকারীদের থেকে] ম্যাপ করা হয়নি


126

আমি "ব্যবহারকারী" সারণী থেকে সমস্ত ব্যবহারকারীর একটি তালিকা পাওয়ার চেষ্টা করছি এবং আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]
org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:180)
org.hibernate.hql.internal.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:110)
org.hibernate.hql.internal.ast.tree.FromClause.addFromElement(FromClause.java:93)

ব্যবহারকারীদের যোগ / যোগ করতে আমি এই কোডটি লিখেছি:

public List<User> getUsers() {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    List<User> result = (List<User>) session.createQuery("from users").list();
    session.getTransaction().commit();
    return result;
}

public void addUser(User user) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    session.save(user);
    session.getTransaction().commit();
}

public void addUser(List<User> users) {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    session.beginTransaction();
    for (User user : users) {
        session.save(user);
    }
    session.getTransaction().commit();
}

ব্যবহারকারীদের যুক্ত করা কাজ করে, তবে যখন আমি উইট ইউজার ফাংশনটি ব্যবহার করি তখন আমি এই ত্রুটিটি পাই।

এটি আমার হাইবারনেট কনফিগারেশন ফাইল:

<hibernate-configuration>
<session-factory>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.default_schema">test</property>
    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

    <property name="show_sql">true</property>

    <property name="format_sql">true</property>
    <property name="hbm2ddl.auto">create-drop</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <property name="current_session_context_class">thread</property>

    <!-- Mapping files will go here.... -->

    <mapping class="model.Company" />
    <mapping class="model.Conference" />
    <mapping class="model.ConferencesParticipants" />
    <mapping class="model.ConferenceParticipantStatus" />
    <mapping class="model.ConferencesUsers" />
    <mapping class="model.Location" />
    <mapping class="model.User" />

</session-factory>

এবং এটি আমার ব্যবহারকারী শ্রেণি:

@Entity
@Table( name = "Users" )
public class User implements Serializable{

    private long userID;
    private int pasportID;
    private Company company; 
    private String name;
    private String email;
    private String phone1;
    private String phone2;
    private String password; //may be null/empty , will be kept hashed
    private boolean isAdmin;
    private Date lastLogin;

    User() {} //not public on purpose!

    public User(int countryID, Company company, String name, String email,
            String phone1, String phone2, String password, boolean isAdmin) {
        this.pasportID = countryID;
        this.company = company;
        this.name = name;
        this.email = email;
        this.phone1 = phone1;
        this.phone2 = phone2;
        this.password = password;
        this.isAdmin = isAdmin;
    }

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy = "increment")
    public long getUserID() {
        return userID;
    }
    public void setUserID(long userID) {
        this.userID = userID;
    }
    ...    
}

কোন ধারণা কেন আমি এই ত্রুটি পেয়েছি?


উত্তর:


297

HQL, আপনি ব্যবহার করা উচিত Java শ্রেণি নাম এবং সম্পত্তি নাম ম্যাপ এর @Entityপ্রকৃত সারণী নাম এবং কলাম নামের পরিবর্তে এখন HQL হওয়া উচিত:

List<User> result = session.createQuery("from User", User.class).getResultList();

আপডেট: আরও সুনির্দিষ্ট হওয়ার জন্য, আপনাকে @Entity"টেবিল" উল্লেখ করার জন্য কনফিগার করা সত্তার নামটি ব্যবহার করা উচিত , যদি আপনি এটি স্পষ্টভাবে সেট না করেন তবে ম্যাপযুক্ত জাভা শ্রেণীর অযোগ্য নামটির ডিফল্ট ।

(পিএস এটি @javax.persistence.Entityকিন্তু না @org.hibernate.annotations.Entity)


10
সুতরাং আসলে এটি এমনকি সংবেদনশীল। সুতরাং "ব্যবহারকারীর কাছ থেকে" একই ব্যতিক্রম
ঘটবে

3
। উত্তর তার একটি অংশ, কিন্তু ত্রুটি সমাধান করতে আমি ভালো পূর্ণ বস্তু পথ ব্যবহার করতে ছিল: [...] createQuery ( "gcv.metier.User থেকে তোমার দর্শন লগ করা u.username = কোথায়?")
রাফায়েল

আমাকেও পুরো পথটি ব্যবহার করতে হয়েছিল, সম্ভবত জেপিএর "ব্যবহারকারী" শব্দটি নিয়ে কোনও সমস্যা আছে? আমার ধারণা এটি কয়েকটি ডিবি বাস্তবায়নে একটি সংরক্ষিত শব্দ। বস্তুত, এই সমস্যাটি কেবল আমাকে ফর্ম যখন আমি থেকে যে ডিবি টেবিল নতুন নামকরণ এসে ব্যবহারকারী থেকে the_user (অন্য এই সমস্যাটি সমাধানের জন্য অংশ) সামনে যে JPA ছিল জরিমানা।
মাইকেল কক্সন

1
প্রাক্তনিকে হ্রাস করা হয়েছে বলে আপনি কি রেজাল্টলিস্ট () পেতে আপডেট লিস্ট () আপডেট করতে পারবেন?
দুর্জা আড়াই

31

উদাহরণস্বরূপ: আপনার মটরশুটি শ্রেণীর নাম ইউজারডেটেল

Query query = entityManager. createQuery("Select UserName from **UserDetails** "); 

আপনি আপনার টেবিলে নাম ডিবিতে দেবেন না। আপনি শিমের বর্গের নাম দিন


12

শুধু আমার অনুসন্ধান ভাগ করে নেওয়ার জন্য। কোয়েরিটি সঠিক শ্রেণির নামটিকে লক্ষ্য করে নিচ্ছিল এমনকি আমি এখনও একই ত্রুটি পেয়েছি। পরে আমি বুঝতে পারি যে আমি ভুল প্যাকেজ থেকে সত্ত্বা শ্রেণি আমদানি করছি।

আমি এর থেকে আমদানি লাইনটি পরিবর্তন করার পরে সমস্যার সমাধান হয়েছিল:

import org.hibernate.annotations.Entity;

প্রতি

import javax.persistence.Entity;

এখন এটি আসলে আমাকে বাঁচিয়েছে।
অনিরুদ্ধ

9

যোগ করা হয়েছে @TABLE(name = "TABLE_NAME")টীকা এবং স্থির। আপনার টীকা এবং হাইবারনেট সিএফজি.এক্সএমএল ফাইল পরীক্ষা করুন। এটি সেই নমুনা সত্তা ফাইল যা কাজ করে:

import javax.persistence.*;

@Entity
@Table(name = "VENDOR")
public class Vendor {

    //~ --- [INSTANCE FIELDS] ------------------------------------------------------------------------------------------
    private int    id;
    private String name;

    //~ --- [METHODS] --------------------------------------------------------------------------------------------------
    @Override
    public boolean equals(final Object o) {    
        if (this == o) {
            return true;
        }

        if (o == null || getClass() != o.getClass()) {
            return false;
        }

        final Vendor vendor = (Vendor) o;

        if (id != vendor.id) {
            return false;
        }

        if (name != null ? !name.equals(vendor.name) : vendor.name != null) {
            return false;
        }

        return true;
    }

    //~ ----------------------------------------------------------------------------------------------------------------
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    public int getId() {
        return id;
    }

    @Basic
    @Column(name = "NAME")
    public String getName() {

        return name;
    }

    public void setId(final int id) {
        this.id = id;
    }

    public void setName(final String name) {    
        this.name = name;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}

8

আপনি hibernate.cfg.xmlএকই ভ্রান্তিতে তৈরি সত্তার জন্য ম্যাপিং যুক্ত করতে ভুলে গেছেন এমন সম্ভাবনা রয়েছে ।


আমিও হাইবারনেট সিএফজি.এক্সএমএল-তে POJO ক্লাস যুক্ত করতে ভুলে গেছি।
চিন্ময়

6

org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users]

এটি সূচিত করে যে হাইবারনেট Userসত্ত্বাকে "ব্যবহারকারী" হিসাবে চেনে না ।

@javax.persistence.Entity
@javax.persistence.Table(name = "Users")
public class User {

@Tableটীকা সেট করে টেবিল নাম "ব্যবহারকারীর" কিন্তু সত্তা নাম এখনও "ব্যবহারকারী" হিসাবে HQL মধ্যে উল্লেখ করা হয় যাবে।

উভয়ই পরিবর্তন করতে আপনার সত্তার নামটি সেট করা উচিত:

// this sets the name of the table and the name of the entity
@javax.persistence.Entity(name = "Users")
public class User implements Serializable{

আরও তথ্যের জন্য আমার উত্তর এখানে দেখুন: হাইবারনেট টেবিল ত্রুটি ম্যাপ করা হয়নি


5

নীচের সম্পত্তিটি আপনার হাইবারনেট বিন বিন্যাসে সেট করা আছে তাও নিশ্চিত করুন:

<property name="packagesToScan" value="yourpackage" />

এটি বসন্ত এবং হাইবারনেটকে বলে যেখানে আপনার ডোমেন শ্রেণি সত্তা হিসাবে টীকাযুক্ত রয়েছে তা কোথায় পাবেন।


5

কিছু লিনাক্স ভিত্তিক মাইএসকিউএল ইনস্টলেশন ক্ষেত্রে সংবেদনশীল প্রয়োজন sensitive চারপাশের কাজ আবেদন করা হয় nativeQuery

@Query(value = 'select ID, CLUMN2, CLUMN3 FROM VENDOR c where c.ID = :ID', nativeQuery = true)

1
আপনি কি নিশ্চিত যে এখানে "লিনাক্স ভিত্তিক মাইএসকিউএল" এর ভূমিকা আছে?
asgs

3

আমিও ভুল সত্ত্বা আমদানি করছিলাম এটি আমদানি import org.hibernate.annotations.Entity; হওয়া উচিতjavax.persistence.Entity;


3

আপনি এনটেটেড ক্লাসটি ব্যবহার করে যোগ করেছেন তাও পরীক্ষা করুন:

new Configuration().configure("configuration file path").addAnnotatedClass(User.class)

হাইবারনেট ব্যবহার করে ডেটাবেজে একটি নতুন টেবিল যুক্ত করার সময় এটি সর্বদা আমার সময় নষ্ট করে।


2

হাইবারনেট সহ স্প্রিংয়ের সময় আমি একই ত্রুটি createQueryপাচ্ছিলাম..আমি আমার বিবৃতিতে লোয়ারকেসে "ব্যবহারকারীর" ব্যবহার করছিলাম এবং আমার ক্লাসটি ব্যবহারকারী ছিল ... তাই আমার প্রশ্নের সাথে এটি ব্যবহারকারীতে পরিবর্তন হয়েছে এবং সমস্যাটির সমাধান হয়েছে।

আগে প্রশ্ন:

Query query= em.createQuery("select u from user u where u.username=:usr AND u.password=:pass",User.class);

পরে জিজ্ঞাসা:

Query query= em.createQuery("select u from User u where u.username=:usr AND u.password=:pass",User.class);

1

আমি এই সমস্যাটি পেয়েছি যখন আমি হাইবারনেট-কোর-5.2.12 দিয়ে পুরানো হাইবারনেট-কোর লাইব্রেরি প্রতিস্থাপন করেছি। তবে আমার সমস্ত কনফিগারেশন ঠিক ছিল। এবং আমি এইভাবে সেশনফ্যাক্টরি তৈরি করে এই সমস্যাটি সমাধান করেছি:

private static SessionFactory buildsSessionFactory() {
    try {
        if (sessionFactory == null) {
            StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
                    .configure("/hibernate.cfg.xml").build();
            Metadata metaData = new MetadataSources(standardRegistry)
                    .getMetadataBuilder().build();
            sessionFactory = metaData.getSessionFactoryBuilder().build();
        }
        return sessionFactory;
    } catch (Throwable th) {

        System.err.println("Enitial SessionFactory creation failed" + th);

        throw new ExceptionInInitializerError(th);

    }
}

আশা করি এটি কাউকে সাহায্য করবে


1

আমি এই প্যাটার্নটি সুপারিশ করছি:

@Entity(name = User.PERSISTANCE_NAME)
@Table(name = User.PERSISTANCE_NAME )
public class User {    
    static final String PERSISTANCE_NAME = "USER";

    // Column definitions here

}

0

আপনার ক্যোয়ারিতে আপনাকে ক্লাসের নাম ব্যবহার করতে হবে (ব্যবহারকারীর) সারণির নাম নয় (ব্যবহারকারী) সুতরাং আপনার ক্যোয়ারীটি "ব্যবহারকারী থেকে"


0

আপনাকে অবশ্যই আপনার নির্বাচিত ক্যোয়ারিতে আপনার সত্তা বা শ্রেণি (কেস সংবেদনশীল) হিসাবে একই নামটি টাইপ করতে হবে। যেমন শ্রেণি নাম / সত্তার নাম ব্যবহারকারী থেকে ব্যবহারকারী নির্বাচন করুন;


0

সহ org.hibernate.hql.internal.ast.QuerySyntaxException: users is not mapped [from users], আপনি usersটেবিল থেকে নির্বাচন করার চেষ্টা করছেন । তবে আপনি আপনার ক্লাসটি দিয়ে মন্তব্য করছেন @Table( name = "Users" )। সুতরাং হয় ব্যবহার করুন users, বা Users


0

আপনি যদি এক্সএমএল কনফিগারেশন ব্যবহার করে থাকেন তবে আপনার অ্যাপ্লিকেশন কনটেক্সট.এক্সএমএল ফাইলে নিম্নলিখিত জাতীয় কিছু দরকার হবে:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" lazy-init="default" autowire="default" dependency-check="default">
<property name="dataSource">
  <ref bean="dataSource" />
</property>
<property name="annotatedClasses">
  <list>
    <value>org.browsexml.timesheetjob.model.PositionCode</value>
  </list>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.