Подтвердить что ты не робот

Org.hibernate.MappingException: Неизвестный объект: annotations.Users

Рассмотрим иерархию:

enter image description here

И следующие классы и 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();
        }


    }
}

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

Когда я запускаю main(), в окне вывода появляется следующее сообщение:

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

Но объект Users находится в пакете annotations, так что не так?

4b9b3361

Ответ 1

Файл конфигурации Hibernate должен определять классы сущностей:

<mapping class="annotations.Users"/>

Или вы должны явно добавить класс в конфигурацию, используя

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

Ответ 2

Когда я пытался переписать мой пример (из tutorialspoint) для использования аннотаций, я получил то же исключение. Это помогло мне (addAnnotatedClass()):

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

Ответ 3

Добавьте в xml следующее:

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

Ответ 4

Для тех, кто использует классы конфигурации Spring Java, вы можете написать следующее:

@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

У меня была такая же проблема.

Используйте @javax.persistence.Entity вместо org.hibernate.annotations.Entity

Ответ 6

Если ваш объект сопоставляется с аннотациями, добавьте в свою конфигурацию следующий код:

configuration.addAnnotatedClass(theEntityPackage.EntityClassName.class);

Например:

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

если ваша сущность сопоставлена ​​с XML файлом, используйте addClass вместо addAnnotatedClass.

В качестве примера:

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

Пинг меня, если вам нужна дополнительная помощь.

Ответ 7

Я столкнулся с одной и той же проблемой, и я искал почти 2 часа и пробовал с различными возможными способами, например, заменой старых hibernate JAR и изменением схемы таблицы DB. Но, наконец, получил решение, как показано ниже:

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

Заменить выше для

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

Затем он будет работать нормально.

Ответ 8

Я не нашел принятый ответ полезным для разрешения исключения, встречающегося в моем коде. И хотя это не является технически неправильным, меня также не удовлетворили предложения других людей о введении избыточности:

  • программно повторно добавить сопоставленный класс с помощью configuration.addAnnotatedClass(...)
  • создать файл hbm.xml и сопоставление ресурсов в hibernate_test.cfg.xml которые были избыточны для существующих аннотаций
  • сканировать пакет, в котором существует (уже сопоставленный) класс, используя внешние зависимости, не упомянутые в исходном вопросе

Тем не менее, я нашел 2 возможных решения, которыми я хотел бы поделиться, оба из которых независимо разрешили исключение, с которым я столкнулся в своем собственном коде.

У меня было то же MappingException что и у @ron (с использованием почти идентичного класса HibernateUtil):

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
}

В моем файле конфигурации hibernate_test.cfg.xml меня есть необходимое отображение классов:

<mapping class="myPackage.Device"/>

И мой класс Device правильно javax.persistence.Entity аннотацией javax.persistence.Entity:

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

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

Два возможных решения:

Во-первых, я использую Hibernate 5.2, и для тех, кто использует Hibernate 5, это решение, использующее объект Metadata для построения SessionFactory должно работать. Похоже, что это рекомендуемый механизм начальной загрузки в Руководстве по началу работы с Hibernate:

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

Во-вторых, хотя Configuration в Hibernate 5 практически не рекомендуется, @ron не сказал, какую версию Hibernate он использовал, так что это решение также может быть полезным для некоторых.

Я обнаружил очень тонкое изменение порядка операций при создании и настройке объектов Configuration и ServiceRegistry чтобы все изменилось в моем собственном коде.

Исходный заказ (Configuration созданная и настроенная до 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;
}

Новый заказ (ServiceRegistry создан и настроен до 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;
}

Рискуя TL;DR, я также укажу, что в отношении hibernate_test.cfg.xml мое тестирование показывает, что метод configuration.getProperties() возвращает только элементы <property/>, а элементы <mapping/> исключаются. Это согласуется со специфическим использованием терминов "свойство" и "сопоставление" в документации API для Configuration. Я признаю, что это поведение может быть связано с тем, что applySettings() удалось applySettings() данные сопоставления в StandardServiceRegistryBuilder. Однако эти данные отображения уже должны были быть проанализированы во время Configuration объекта Configuration и доступны ему при buildSessionFactory(). Поэтому я подозреваю, что это может быть связано с деталями реализации, касающимися приоритета ресурсов, когда ServiceRegistry передается в метод Configuration buildSessionFactory().

Я знаю, что этому вопросу уже несколько лет, но я надеюсь, что этот ответ сэкономит кому-то часы исследований, которые я потратил на его вывод. Ура!

Ответ 9

Вместо использования HibernateUtil.java для создания объекта sessionfactory вы должны использовать это:

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

Так как во избежание исключения вам нужно объявить объект класса в файле HibernateUtil.java как configuration.addAnnotatedClass(Student_Info.class);, который выглядит немым, потому что мы предоставили запись уже в файле hibernate.cfg.xml.

Чтобы использовать класс AnnotationConfiguration, вам нужно добавить банку к пути создания проекта: http://www.java2s.com/Code/Jar/h/Downloadhibernate353jar.htm

Ответ 10

У меня была аналогичная проблема и добавление

 sessionFactory.setAnnotatedClasses(User.class);

эта строка помогла, но до этого у меня была

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

Я не уверен, почему этот не работает. Класс пользователя находится под com.rg.spring.model Пожалуйста, дайте мне знать, как заставить его работать с помощью метода packagesToScan.

Ответ 11

 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

Ответ 12

Добавьте следующий код в файл hibernate.cfg.xml

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

Ответ 13

Проверьте, что имя пакета указано в property packagesToScan в dispatcher-servlet.xml

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

Ответ 14

Используйте EntityScanner, если вы можете переносить внешнюю зависимость. Он без проблем внедрит все ваши классы сущностей даже из нескольких пакетов. Просто добавьте следующую строку после настройки конфигурации.

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>

Таким образом, вам не нужно объявлять все сущности в файле отображения hibernate.

Ответ 15

Если вы используете версию 5.0x, конфигурация со стандартным реестром служб устарела.

Вместо этого вы должны загрузить его с метаданными: в вашем классе HibernateUtil вы должны добавить

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(...) {
        ...
    }
}

Ответ 16

В моем случае это configuration.addAnnotatedClass(com.myApp.model.Example.class); добавлением configuration.addAnnotatedClass(com.myApp.model.Example.class); после Configuration configuration = new Configuration().configure(HibernateUtil.class.getResource("/hibernate.cfg.xml")); в классе hibernateUtill. Это читает отображение из метаданных аннотации класса. Узнайте больше о addAnnotatedClass() здесь.

Ответ 17

Определите класс Entity в Hibernate.cfg.xml

<mapping class="com.supernt.Department"/>

При создании объекта sessionFactory Загрузите файл конфигурации Как

SessionFactory factory = new AnnotationConfiguration().configure("hibernate.cfg.xml").buildSessionFactory();

Ответ 18

Проблема возникает из-за записи mapping class="annotations.Users" в hibernate.cfg.xml удаляет эту строку, тогда она будет работать.

У меня была такая же проблема. Когда я удалил вышеприведенную строку, он работал отлично для меня.