2017-01-18 10 views
1

Я прошел через большинство подобных выпусков, размещенных здесь, и найденное решение состояло в использовании javax.persistence. Импорт сущностей вместо org.hibernate.annotations.Entity.Исключение из темы «main» org.hibernate.MappingException: Неизвестная сущность: com.myApp.data.entities.User

Я использовал правильный импорт, но по-прежнему получать org.hibernate.MappingException

Я использую MySQL-разъем-Java версии 6.0.5 с Hibernate-версия ядра 5.2.6.Final и гибернация-аннотаций версии 3.5.6-Final

Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.myApp.data.entities.User 
    at org.hibernate.metamodel.internal.MetamodelImpl.entityPersister(MetamodelImpl.java:620) 
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1627) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669) 
    at com.myApp.data.Application.main(Application.java:26) 

pom.xml выглядит следующим образом:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.myApp</groupId> 
    <artifactId>hibernate-course</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>hibernate-course</name> 
    <dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>5.2.6.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-annotations</artifactId> 
     <version>3.5.6-Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.22</version> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>6.0.5</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>1.7.22</version> 
    </dependency> 
    </dependencies> 
</project> 

Ниже мой основной класс Application.java

package com.myApp.data; 

import java.util.Date; 

import org.hibernate.Session; 

import com.myApp.data.entities.User; 


public class Application { 

    public static void main(String[] args) { 
     Session session = HibernateUtil.getSessionFactory().openSession(); 
     session.getTransaction().begin(); 

     User user = new User(); 
     user.setBirthDate(new Date()); 
     user.setCreatedBy("Smith"); 
     user.setCreatedDate(new Date()); 
     user.setEmailAddress("[email protected]"); 
     user.setFirstName("David"); 
     user.setLastName("Copperfield"); 
     user.setLastUpdatedBy("david"); 
     user.setLastUpdatedDate(new Date()); 

     session.save(user); 

     session.close(); 
    } 
} 

Entity пользователя Класс Класс

package com.myApp.data.entities; 

import java.util.Date; 

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="finances_user") 
public class User { 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name="USER_ID") 
    private Long userId; 

    @Column(name="FIRST_NAME") 
    private String firstName; 

    @Column(name="LAST_NAME") 
    private String lastName; 

    @Column(name="BIRTH_DATE") 
    private Date birthDate; 

    @Column(name="EMAIL_ADDRESS") 
    private String emailAddress; 

    @Column(name="LAST_UPDATED_DATE") 
    private Date lastUpdatedDate; 

    @Column(name="LAST_UPDATED_BY") 
    private String lastUpdatedBy; 

    @Column(name="CREATED_DATE") 
    private Date createdDate; 

    @Column(name="CREATED_BY") 
    private String createdBy; 

    public Long getUserId() { 
     return userId; 
    } 

    public void setUserId(Long userId) { 
     this.userId = userId; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public Date getBirthDate() { 
     return birthDate; 
    } 

    public void setBirthDate(Date birthDate) { 
     this.birthDate = birthDate; 
    } 

    public String getEmailAddress() { 
     return emailAddress; 
    } 

    public void setEmailAddress(String emailAddress) { 
     this.emailAddress = emailAddress; 
    } 

    public Date getLastUpdatedDate() { 
     return lastUpdatedDate; 
    } 

    public void setLastUpdatedDate(Date lastUpdatedDate) { 
     this.lastUpdatedDate = lastUpdatedDate; 
    } 

    public String getLastUpdatedBy() { 
     return lastUpdatedBy; 
    } 

    public void setLastUpdatedBy(String lastUpdatedBy) { 
     this.lastUpdatedBy = lastUpdatedBy; 
    } 

    public Date getCreatedDate() { 
     return createdDate; 
    } 

    public void setCreatedDate(Date createdDate) { 
     this.createdDate = createdDate; 
    } 

    public String getCreatedBy() { 
     return createdBy; 
    } 

    public void setCreatedBy(String createdBy) { 
     this.createdBy = createdBy; 
    } 

} 

Hibernate Configuration SessionFactory

package com.myApp.data; 

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

public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      Configuration configuration = new Configuration(); 
      configuration.configure(); 
      return configuration 
        .buildSessionFactory(new StandardServiceRegistryBuilder() 
          .applySettings(configuration.getProperties()) 
          .build()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw new RuntimeException(
        "There was an error building the factory"); 
     } 
    } 

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

и, наконец, 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> 

     <!-- Database connection settings --> 
     <property name="connection.url">jdbc:mysql://localhost:3306/ifinances?useSSL=false</property> 
     <property name="connection.username">infinite</property> 
     <property name="connection.password">skills</property> 

     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 

     <mapping class="com.myApp.data.entities.User"/> 

    </session-factory> 

</hibernate-configuration> 

Я проверил то же самое, используя hibernate.properties вместо hibernate.cfg.xml by usin g configuration.addAnnotatedClass(User.class); И он скомпилирован и выполнен без каких-либо исключений.

+0

Хотелось бы взглянуть на этот метод: configuration.configure(); внутри вашего HibernateUtil –

+0

Нет, это не API JPA. Тэги исправлены! –

+0

@MaciejKowalski Я использовал configuration.configure(); чтобы установить hibernate.cfg.xml как конфигурацию по умолчанию, так как у меня также есть файл hibernate.properties внутри моих ресурсов. – eccentricCoder

ответ

0

попробуйте использовать функцию аннотацииконфигурации вместо конфигурации.

Configuration configuration = new AnnotationConfiguration(); 
+0

Это приводит к ошибке java.lang.NoClassDefFoundError: org/hibernate/cfg/Mappings – eccentricCoder

2

Нашли решение. Вышеприведенный код будет работать нормально в Hibernate 4.3.6, но проблема заключается в работе с Hibernate 5. Проблема с помощью следующего кода:

return configuration 
      .buildSessionFactory(new StandardServiceRegistryBuilder() 
        .applySettings(configuration.getProperties()) 
        .build()); 

Проблема заключается в том, когда вы проходите StandardServiceRegistryBuilder в качестве аргумента внутри buildSessionFactory(). Когда вы это сделаете, конфигурация потеряет всю информацию о сопоставлении, которая получена с помощью инструкции configuration.configure();.

Вот почему код работает нормально при использовании hibernate.properties файла (использование которого оленьей кожи configuration.configure()), но возникает исключение при использовании hibernate.cfg.xml.

При использовании hibernate.cfg.xml

При использовании метода настройки спящего режима XML, вы можете просто вернуть sessionFactory, который использует no-argbuildSessionFactory() метод.

Фактический код работы (с использованием hibernate.cfg.xml)

Выпуск решена!

package com.myApp.data; 

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

import com.myApp.data.entities.User; 

public class HibernateUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      Configuration configuration = new Configuration(); 
      configuration.configure(); 

      /*return configuration 
        .buildSessionFactory(new StandardServiceRegistryBuilder() 
          .applySettings(configuration.getProperties()) 
          .build()); -- does not work while using hibernate.cfg.xml, but works with hibernate.properties*/ 

      return configuration 
        .buildSessionFactory(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      throw new RuntimeException(
        "There was an error building the factory"); 
     } 
    } 

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

Спасибо за всех, кто помог!

+0

@MattC вы спасли мой день! – eccentricCoder

+0

Рад, что сработало для вас. Когда сомневаюсь, я пытаюсь упростить и попробовать разные варианты. – MattC