it-swarm.com.de

org.hibernate.MappingException: Unbekannte Entität: annotations.Users

Betrachten Sie die Hierarchie: 

enter image description here

Und die folgenden Klassen und XML: 

HibernateUtil.Java

package annotations;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;


/**
 * 
 * @author X3
 *
 */
public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static final String HIBERNATE_CFG = "hibernateAnnotations.cfg.xml";

    private static SessionFactory buildSessionFactory() 
    {
        Configuration cfg = new Configuration().addResource(HIBERNATE_CFG).configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
                applySettings(cfg.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Users.Java

package annotations;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import Java.sql.Timestamp;

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

    @Id
    @GeneratedValue
    @Column(name = "USER_ID")
    private long userID;

    @Column(name = "USERNAME", nullable = false, length = 100)
    private String username;

    @Column(name = "MessageTimeDate", nullable = false)
    private Java.sql.Timestamp datetime;

    @Column(name = "UserMessage", nullable = false)
    private String message;



    public Users(String username , String message)
    {
        Java.util.Date date = new Java.util.Date();
        this.datetime = new Timestamp(date.getTime());

        this.username = username;
        this.message = message;
    }

    public long getUserID() {
        return userID;
    }

    public void setUserID(long userID) {
        this.userID = userID;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Java.sql.Timestamp getDatetime() {
        return datetime;
    }

    public void setDatetime(Java.sql.Timestamp datetime) {
        this.datetime = datetime;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

Main.Java  

package annotations;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class Main {

    public static void main(String[] args) {

        try
        {
               SessionFactory sf = HibernateUtil.getSessionFactory();
               Session session = sf.openSession();
               session.beginTransaction();

               Users user1 = new Users("Jack" , "Hello");
               session.save(user1);
               session.getTransaction().commit();
               session.close();
        }

        catch (Exception e)
        {
            System.out.println(e.toString());
            e.getStackTrace();
        }


    }
}

Und hibernateAnnotations.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="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/CHAT_DB</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <mapping class="annotations.Users"></mapping>       
    </session-factory>
</hibernate-configuration>

Beim Ausführen von main () wird der folgende Fehler im Ausgabefenster angezeigt: 

org.hibernate.MappingException: Unknown entity: annotations.Users

Aber die Entität Users befindet sich im annotations-Paket. Was ist also los? 

38
ron

Die Hibernate-Konfigurationsdatei muss die Entitätsklassen definieren:

<mapping class="annotations.Users"/>

Oder Sie müssen die Klasse explizit mit der Konfiguration hinzufügen

configuration.addClass(annotations.Users.class)
// Read mappings as a application resourceName
 // addResource is for add hbml.xml files in case of declarative approach
configuration.addResource("myFile.hbm.xml");  // not hibernateAnnotations.cfg.xml
64
Asif Bhutto

Als ich versuchte, mein Beispiel (von tutorialspoint) für die Verwendung von Anmerkungen zu überschreiben, erhielt ich die gleiche Ausnahme. Das hat mir geholfen (addAnnotatedClass ()):

Configuration cfg=new Configuration(); 
cfg.addAnnotatedClass(com.tutorialspoint.hibernate.entity.Employee.class);
cfg.configure();
10
user5728489

Fügen Sie Ihrer XML-Datei Folgendes hinzu:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
        <list>
            <value>annotations</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
7
user2247545

Für diejenigen, die die Java-Konfigurationsklassen von Spring verwenden, können Sie Folgendes schreiben:

@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
    sessionBuilder.addProperties(getHibernateProperties());
    sessionBuilder.addAnnotatedClasses(Foo.class);
    sessionBuilder.addAnnotatedClasses(Bar.class);
    sessionBuilder.addAnnotatedClasses(Bat.class);
    return sessionBuilder.buildSessionFactory();
}
5
Marvo

Ich hatte das gleiche Problem. 

Verwenden Sie @javax.persistence.Entity anstelle von org.hibernate.annotations.Entity

5

Wenn Ihre Entität durch Anmerkungen zugeordnet wird, fügen Sie der Konfiguration den folgenden Code hinzu.

configuration.addAnnotatedClass(theEntityPackage.EntityClassName.class);

Zum Beispiel;

configuration.addAnnotatedClass(com.foo.foo1.Products.class);

wenn Ihre Entität mit einer XML-Datei verknüpft ist, verwenden Sie addClass anstelle von addAnnotatedClass.

Als Beispiel;

configuration.addClass(com.foo.foo1.Products.class);

Ping mich, wenn Sie mehr Hilfe benötigen.

3
Ad Infinitum

Ich war mit dem gleichen Problem konfrontiert und habe fast zwei Stunden lang gesucht und versucht, mit verschiedenen Möglichkeiten zu arbeiten, beispielsweise alte JARs im Ruhezustand zu ersetzen und das DB-Tabellenschema zu ändern. Aber endlich die Lösung wie folgt:

SessionFactory factory = new Configuration().configure().buildSessionFactory(); //This line to be replaced with below commented line

Ersetzen Sie oben für

//Configuration config = new Configuration().configure();
//ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
//SessionFactory factory = config.buildSessionFactory(servReg);

Es wird dann gut funktionieren ..

3
JR Sahoo.'JS'

Die akzeptierte Antwort fand ich nicht hilfreich, um die in meinem Code festgestellte Ausnahme zu beheben. Und obwohl es technisch nicht unrichtig ist, war ich auch nicht mit den Vorschlägen anderer zur Einführung von Redundanz zufrieden:

  • fügen Sie die zugeordnete Klasse mithilfe von configuration.addAnnotatedClass(...) wieder programmgesteuert hinzu.
  • erstellen Sie eine hbm.xml-Datei und eine Ressourcenzuordnung in hibernate_test.cfg.xml, die für die vorhandenen Anmerkungen redundant waren
  • scannen Sie das Paket, in dem die (bereits zugeordnete) Klasse vorhanden ist, und verwenden Sie externe Abhängigkeiten, die in der ursprünglichen Frage nicht aufgeführt sind

Ich habe jedoch 2 mögliche Lösungen gefunden, die ich teilen wollte. Beide Lösungen lösten unabhängig voneinander die Ausnahme, die ich in meinem eigenen Code gefunden habe.

Ich hatte dieselbe MappingException wie @ron (mit einer fast identischen HibernateUtil-Klasse):

public final class HibernateUtil {

    private static SessionFactory sessionFactory = null;
    private static ServiceRegistry serviceRegistry = null;

    private HibernateUtil() {}

    public static synchronized SessionFactory getSessionFactory() {
        if ( sessionFactory == null ) {
            Configuration configuration = new Configuration().configure("hibernate_test.cfg.xml");
            serviceRegistry = new StandardServiceRegistryBuilder()
                    .applySettings(configuration.getProperties())
                    .build();
            sessionFactory = configuration.buildSessionFactory( serviceRegistry );
        }
        return sessionFactory;
    }
// exception handling and closeSessionFactory() omitted for brevity
}

In meiner hibernate_test.cfg.xml-Konfigurationsdatei habe ich die erforderliche Klassenzuordnung:

<mapping class="myPackage.Device"/>

Und meine Device-Klasse wird ordnungsgemäß mit der javax.persistence.Entity-Annotation versehen:

package myPackage.core;
import javax.persistence.*;

@Entity
@Table( name = "devices" )
public class Device {
    //body omitted for brevity
}

Zwei mögliche Lösungen:

First, ich verwende Hibernate 5.2, und für diejenigen, die Hibernate 5 verwenden, sollte diese Lösung funktionieren, die ein Metadata-Objekt verwendet, um eine SessionFactory zu erstellen. Es scheint auch das aktuell empfohlene native Bootstrap-Mechanismus im Hibernate-Einführungshandbuch zu sein:

public static synchronized SessionFactory getSessionFactory() {
    if ( sessionFactory == null ) {

        // exception handling omitted for brevity

        serviceRegistry = new StandardServiceRegistryBuilder()
                .configure("hibernate_test.cfg.xml")
                .build();

        sessionFactory = new MetadataSources( serviceRegistry )
                    .buildMetadata()
                    .buildSessionFactory();
    }
    return sessionFactory;
}

Second, während Configurationsemi-deprecated in Hibernate 5 ist, hat @ron nicht gesagt, welche Version von Hibernate er verwendete, daher könnte diese Lösung für einige von Wert sein . 

Bei der Instanziierung und Konfiguration von Configuration- und ServiceRegistry-Objekten habe ich eine sehr geringfügige Änderung in der Reihenfolge der Operationen festgestellt, um den Unterschied in meinem eigenen Code zu bestimmen. 

Originalauftrag (Configuration erstellt und konfiguriert vor ServiceRegistry):

public static synchronized SessionFactory getSessionFactory() {
    if ( sessionFactory == null ) {

        // exception handling omitted for brevity

        Configuration configuration = new Configuration().configure("hibernate_test.cfg.xml");

        serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings( configuration.getProperties() )
                .build();

        sessionFactory = configuration.buildSessionFactory( serviceRegistry );
    }
    return sessionFactory;
}

Neuer Auftrag (ServiceRegistry erstellt und konfiguriert vor Configuration):

public static synchronized SessionFactory getSessionFactory() {
    if ( sessionFactory == null ) {

        // exception handling omitted for brevity

        serviceRegistry = new StandardServiceRegistryBuilder()
                .configure("hibernate_test.cfg.xml")
                .build();

        sessionFactory = new Configuration().buildSessionFactory( serviceRegistry );
    }
    return sessionFactory;
}

Auf das Risiko eines TLDR hin weise ich auch darauf hin, dass in Bezug auf hibernate_test.cfg.xml meine Tests darauf hindeuten, dass die configuration.getProperties()-Methode nur <property />-Elemente zurückgibt und <mapping />-Elemente ausgeschlossen sind. Dies scheint konsistent mit der spezifischen Verwendung der Begriffe 'Eigenschaft' und 'Zuordnung' in der API-Dokumentation für Configuration zu sein. Ich werde zugeben, dass dieses Verhalten etwas damit zu tun hat, dass applySettings() die Zuordnungsdaten nicht in die StandardServiceRegistryBuilder übertragen hat. Diese Zuordnungsdaten sollten jedoch bereits während der Konfiguration des Configuration-Objekts analysiert worden sein und diesem beim Aufruf von buildSessionFactory() zur Verfügung stehen. Daher vermute ich, dass dies auf implementierungsspezifische Details bezüglich der Ressourcenpriorität zurückzuführen ist, wenn eine ServiceRegistry an die buildSessionFactory()-Methode eines Configuration-Objekts übergeben wird.

Ich weiß, dass diese Frage jetzt mehrere Jahre alt ist, aber ich hoffe, dass diese Antwort jemandem die stundenlangen Recherchen erspart, die ich für die Ableitung aufgewendet habe. Prost!

3
Philip Wrage

Anstatt HibernateUtil.Java zum Erstellen eines sessionfactory-Objekts zu verwenden, sollten Sie Folgendes verwenden:

SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();

Um die Ausnahme zu vermeiden, müssen Sie das Klassenobjekt in der Datei HibernateUtil.Java als configuration.addAnnotatedClass(Student_Info.class); deklarieren, was dumm aussieht, da der Eintrag bereits in der Datei hibernate.cfg.xml enthalten ist.

Um die AnnotationConfiguration-Klasse verwenden zu können, müssen Sie Ihrem Projekterstellungspfad eine jar hinzufügen: http://www.Java2s.com/Code/Jar/h/Downloadhibernate353jar.htm

1
Narendra Rawat

Ich hatte ein ähnliches Problem und fügte hinzu 

 sessionFactory.setAnnotatedClasses(User.class);

diese Linie hat geholfen, aber vorher hatte ich 

sessionFactory.setPackagesToScan(new String[] { "com.rg.spring.model" });

Ich bin nicht sicher, warum das nicht funktioniert. Die Benutzerklasse befindet sich unter com.rg.spring.model Bitte lassen Sie mich wissen, wie sie über die packagesToScan-Methode funktioniert.

1
Rakesh Goswami
 public static void main(String[] args) {
      try{
        // factory = new Configuration().configure().buildSessionFactory();
         factory = new AnnotationConfiguration().
                   configure().
                   //addPackage("com.xyz") //add package if used.
                   addAnnotatedClass(Employee.class).
                   buildSessionFactory();
      }catch (Throwable ex) { 
         System.err.println("Failed to create sessionFactory object." + ex);
         throw new ExceptionInInitializerError(ex); 
      }//you can write like this in your test class inside main method.this way you will be able to do the things using annotaions only
0
Mithun Debnath

Wenn Sie die 5.0x-Version verwenden, ist die Konfiguration mit der Standard-Service-Registry nicht mehr empfohlen .

Stattdessen sollten Sie es mit Metadata : .__ bootstrappen. In Ihrer HibernateUtil-Klasse sollten Sie Folgendes hinzufügen

private static SessionFactory buildSessionFactory() {
    try {           
        StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
            .configure( "hibernate.cfg.xml" )
            .build();

        Metadata metadata = new MetadataSources( standardRegistry )
            .getMetadataBuilder()
            .build();

        return metadata.getSessionFactoryBuilder().build();
    } catch(...) {
        ...
    }
}
0
Sanjay Maredla

Überprüfen Sie, ob der Paketname in der Datei property packagesToScan in der Datei dispatcher-servlet.xml angegeben ist 

<bean id="sessionFactory"             class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="packagesToScan" value="**entity package name here**"></property> 
        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
            </props>  
        </property>  
    </bean>
0
Master Mind

Fügen Sie den folgenden Code zu hibernate.cfg.xml hinzu

  <property name="hibernate.c3p0.min_size">5</property>
  <property name="hibernate.c3p0.max_size">20</property>
  <property name="hibernate.c3p0.timeout">300</property>
  <property name="hibernate.c3p0.max_statements">50</property>
  <property name="hibernate.c3p0.idle_test_period">3000</property>
0
Sandy

Verwenden Sie EntityScanner , wenn Sie die externe Abhängigkeit ertragen können. Es werden alle Entitätsklassen nahtlos aus mehreren Paketen eingefügt. Fügen Sie nach der Konfigurationseinstellung einfach die folgende Zeile hinzu.

Configuration configuration = new Configuration().configure();    
EntityScanner.scanPackages("com.fz.epms.db.model.entity").addTo(configuration);
// And following depencency if you are using Maven
<dependency>
        <groupId>com.github.v-ladynev</groupId>
        <artifactId>fluent-hibernate-core</artifactId>
        <version>0.3.1</version>
</dependency>

Auf diese Weise müssen Sie nicht alle Entitäten in der Hibernate-Zuordnungsdatei deklarieren.

0
M Faisal Hameed

In meinem Fall wird dies durch Hinzufügen von configuration.addAnnotatedClass(com.myApp.model.Example.class); nach Configuration configuration = new Configuration().configure(HibernateUtil.class.getResource("/hibernate.cfg.xml")); in der Klasse hibernateUtill behoben. Es liest eine Zuordnung aus den Klassenanmerkungs-Metadaten. Lesen Sie mehr über addAnnotatedClass() von hier .

0
Irfan