Java hibernate中使用注释的未知实体异常

Java hibernate中使用注释的未知实体异常,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我收到未知实体异常。我不明白为什么会收到 Customer.java package p1; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.

我收到未知实体异常。我不明白为什么会收到

Customer.java

package p1;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="customers")
public class Customer {



    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="cid")
    private int cid;

    @Column(name="cname")
    private String cname;

    @Column(name="email")
    private String email;

    @Column(name="phone")
    private long phone;

    @Column(name="city")
    private String city;

    @Column(name="bal")
    private double bal;

    Customer(){
        System.out.println("default constructor");
    }

    //setters and getters


}
Lab.java

package p1;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class Lab {

    public static void main(String[] args) {

try{


            Configuration cf=new Configuration().configure("p1/hibernate.cfg.xml").addAnnotatedClass(p1.Customer.class);

            StandardServiceRegistryBuilder ssrbuilder=new StandardServiceRegistryBuilder();

            StandardServiceRegistry ssRegistry=ssrbuilder.applySettings(cf.getProperties()).build();

            SessionFactory factory=cf.buildSessionFactory(ssRegistry);

            Session s=factory.openSession();

             org.hibernate.Transaction t=s.beginTransaction();

             p1.Customer c=new Customer();
                c.setCity("Bangalore");
                c.setCname("nithin1");
                c.setEmail("nithin1@gmail.com");
                c.setBal(21);

                 s.save(c);

                 t.commit();
                 s.close();


        }catch (Exception e) {
            e.printStackTrace();
        }


    }

    }
hibernate.cfg.xml

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3307/nithin</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
     <property name="hbm2ddl.auto">create</property>
        <property name="show_sql">true</property>

        <mapping class="p1.Customer"/>

    </session-factory>
</hibernate-configuration>
<mapping resource="p1.Customer.hbm.xml"/>

com.mysql.jdbc.Driver
根
jdbc:mysql://localhost:3307/nithin
根
org.hibernate.dialogue.mysqldialogue
创造
真的
控制台中的异常

org.hibernate.MappingException:未知实体:p1.客户 位于org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:684) 位于org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1692) 位于org.hibernate.event.internal.AbstractSaveEventListener.SaveWithGenerateId(AbstractSaveEventListener.java:122) 在org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 位于org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 位于org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 位于org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 位于org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 位于org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:709) 位于org.hibernate.internal.SessionImpl.save(SessionImpl.java:701) 位于org.hibernate.internal.SessionImpl.save(SessionImpl.java:696) 位于p1.Lab.main(Lab.java:34)


请帮忙,谢谢。

您的hibernate.cfg.xml中似乎有输入错误

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3307/nithin</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
     <property name="hbm2ddl.auto">create</property>
        <property name="show_sql">true</property>

        <mapping class="p1.Customer"/>

    </session-factory>
</hibernate-configuration>
<mapping resource="p1.Customer.hbm.xml"/>

应该是

<mapping resource="Customer.hbm.xml"/>

您应该更改在Lab1类中获取会话的方式。有点像:

package main;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import p1.Customer;

public class Main {
    private static StandardServiceRegistry registry;
    private static SessionFactory sessionFactory;

    public static void main(String[] args) throws Exception {

    try {

        registry = new StandardServiceRegistryBuilder().configure().build();

        // Create MetadataSources
        MetadataSources sources = new MetadataSources(registry);

        // Create Metadata
        Metadata metadata = sources.getMetadataBuilder().build();

        // Create SessionFactory
        sessionFactory = metadata.getSessionFactoryBuilder().build();

        Session s = sessionFactory.openSession();
        Customer c = new Customer();
        c.setCname("nithin");

        org.hibernate.Transaction t = s.beginTransaction();

        s.save(c);
        t.commit();
        s.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

这是您的文件资源/hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.password">xxxx</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xxxx</property>
    <property name="hibernate.connection.username">xxxx</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

    <property name="show_sql">true</property>
    <mapping resource="p1/Customer.hbm.xml"/>

</session-factory>

com.mysql.jdbc.Driver
xxxx
jdbc:mysql://localhost:3306/xxxx
xxxx
org.hibernate.dialogue.mysqldialogue
真的

然后将Customer.hbm.xml放在Entity Customer.java的同一文件夹中

package p1;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="customers")
public class Customer {



    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="cid")
    private int cid;

    @Column(name="cname")
    private String cname;

    @Column(name="email")
    private String email;

    @Column(name="phone")
    private long phone;

    @Column(name="city")
    private String city;

    @Column(name="bal")
    private double bal;

    Customer(){
        System.out.println("default constructor");
    }

    //setters and getters


}

我测试过了,它成功了

可能的重复并没有解决我的问题因为你是新来的Hibernate那么你应该更好地使用注释而不是XML。你唯一需要做的就是使用我建议的代码来初始化配置并获取SessionFactory它在我这边工作!你的hibernate.cfg.xml在哪里?您是否将其放在文件夹资源中?