Hibernate 5: - org.hibernate.MappingException: Неизвестный объект
Я получаю сообщение об ошибке org.hibernate.MappingException: Unknown entity
, когда я пытаюсь интегрировать hibernate 5.0 с mysql
Это, похоже, проблема с hibernate5.0.0 и 5.0.1. Это отлично работает с спящим 4.3.9
Зависимости Maven
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.0.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
hibernate.cfg.xml
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3307/SampleDB
</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<mapping class="UserA.User"></mapping>
</session-factory>
Код HibernateMain.java
package UserA;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.Map;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.service.ServiceRegistry;
public class HibernateMain {
public static void main(String[] args) {
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory sf = configuration.buildSessionFactory(sr);
User user1 = new User();
user1.setUserName("Arpit");
user1.setUserMessage("Hello world from arpit");
user1.setUserId(22);
Session ss = sf.openSession();
ss.beginTransaction();
// saving objects to session
ss.save(user1);
ss.getTransaction().commit();
ss.close();
}
}
User.java
package UserA;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity(name="User_table")
public class User {
@Id
int userId;
@Column(name = "User_Name")
String userName;
@Column(name = "User_Message")
String userMessage;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserMessage() {
return userMessage;
}
public void setUserMessage(String userMessage) {
this.userMessage = userMessage;
}
}
Ответы
Ответ 1
Я исправил ту же проблему с Hibernate 5. В этом коде есть проблема
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
SessionFactory sf = configuration.buildSessionFactory(sr);
Этот код отлично работает для Hibernate 4.3.5, но тот же код имеет ту же самую проблему для Hibernate 5.
Когда вы выполняете configuration.buildSessionFactory(sr)
, использование Hibernate 5, Configuration
потеряет всю информацию о сопоставлении, которое получает по вызову configuration.configure()
.
Решение
Чтобы устранить проблему, если вы используете стандартные файлы конфигурации hibernate.cfg.xml
и hibernate.properties
, вы можете создать сеанс factory таким образом (без ServiceRegistry
)
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Загрузка свойств
Если у вас есть свойства в другом файле, то hibernate.properties
, вы можете создать сеанс factory с помощью StandardServiceRegistryBuilder
(в любом случае, если у вас есть hibernate.properties
и другой файл, он будет загружен как)
Загрузка свойств в качестве ресурса
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
configure().loadProperties("hibernate-h2.properties").build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);
В пути к классу должен быть hibernate-h2.properties
(корень из папки источников, папка ресурсов). Вы также можете указать путь из корневой папки источника
/com/github/xxx/model/hibernate-h2.properties
.
Загрузка свойств из пути в файловой системе
File propertiesPath = new File("some_path");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
configure().loadProperties(propertiesPath).build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);
Вы можете найти пример консольного приложения, используя этот подход здесь fluent-hibernate-mysql. Он использует класс утилиты для сборки сеанса factory из библиотеки с быстрым спящим режимом.
Неверный учебник Hibernate 5
В учебнике Hibernate 5 приведен неверный пример 1.1.6. Запуск и помощники. Он использует этот код
return new Configuration().configure().buildSessionFactory(
new StandardServiceRegistryBuilder().build() );
Он не выполняет правильную конфигурацию.
Ответ 2
В Hibernate 5 вам нужно построить StandardServiceRegistry
и Metadata
для сборки SessionFactory
. Вы можете использовать следующий HibernateUtil
для сборки SessionFactory
. hibernate.cfg.xml
должен находиться в корневой части пути к вашему приложению.
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder() .configure("hibernate.cfg.xml").build();
Metadata metadata = new MetadataSources(standardRegistry).getMetadataBuilder().build();
return metadata.getSessionFactoryBuilder().build();
}
catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Кроме того, если вы используете Hibernate 5 и используете @Id
в качестве стратегии генерации идентификатора, то с помощью GenerationType.AUTO
по умолчанию создается генератор идентичности "sequence" с MySQL, который предоставит вам com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist
исключение, если оно не настроено в ваших сущностях по атрибутам идентификатора. Поэтому с Hibernate 5 используйте GenerationType.IDENTITY
.
Ответ 3
Вы не добавили конфигурационный файл
configuration.configure("/hibernate.cfg.xml");
Ответ 4
Убедитесь, что вы создали файл сопоставления User.hbm.xml или User.xml и включили этот файл в файл hibernate.cfg.xml
Ответ 5
Я думаю, что это простой способ решить эту проблему.
@Entity
@Table(name="User_table")
public class User {
@Id
int userId;
@Column(name = "User_Name")
String userName;
.................
Ответ 6
Используя это:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Session session = sessionFactory.openSession();
вместо этого:
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session session = factory.openSession();
решил проблему с Hibernate 5.2.10.Final.
Ответ 7
Я столкнулся с одной и той же проблемой, и я искал почти 2 часа и пробовал с различными возможными способами, как замена старых hibernate jars & изменение схемы таблицы db. Но, наконец, получил решение, как показано ниже:
//This line to be replaced with below commented line
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Заменить выше для
Configuration config = new Configuration().configure();
ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory factory = config.buildSessionFactory(servReg);
Затем он будет работать нормально.