Je reçois le message d'erreur org.hibernate.MappingException: Unknown entity
lorsque j'essaie d'intégrer hibernate 5.0 à mysql
Cela semble être un problème avec hibernate5.0.0 et 5.0.1. Cela fonctionne très bien avec Hibernate 4.3.9
<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>
<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>
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();
}
}
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;
}
}
J'ai résolu le même problème avec Hibernate 5. Il y a un problème dans ce code
Configuration configuration = new Configuration();
configuration.configure();
ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
SessionFactory sf = configuration.buildSessionFactory(sr);
Ce code fonctionne bien pour Hibernate 4.3.5, mais le même code a le même problème pour Hibernate 5.
Quand vous faites configuration.buildSessionFactory(sr)
, en utilisant Hibernate 5, Configuration
perd toutes les informations sur le mappage obtenu par appel configuration.configure()
.
Solution
Pour résoudre le problème, si vous utilisez les fichiers de configuration standard hibernate.cfg.xml
et hibernate.properties
, vous pouvez créer la fabrique de sessions de cette manière (sans ServiceRegistry
).
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Chargement des propriétés
Si vous avez des propriétés dans un fichier autre que hibernate.properties
, vous pouvez créer une fabrique de session en utilisant StandardServiceRegistryBuilder
(de toute façon, si vous avez hibernate.properties
et un autre fichier, il sera chargé à la fois)
Pour charger des propriétés en tant que ressource
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
configure().loadProperties("hibernate-h2.properties").build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);
Vous devez avoir hibernate-h2.properties
dans le chemin de classe (racine du dossier sources, dossier resources). Vous pouvez également spécifier un chemin à partir du dossier source racine /com/github/xxx/model/hibernate-h2.properties
.
Pour charger des propriétés à partir d'un chemin dans le système de fichiers
File propertiesPath = new File("some_path");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().
configure().loadProperties(propertiesPath).build();
SessionFactory sf = new Configuration().buildSessionFactory(serviceRegistry);
Vous pouvez trouver un exemple d'application console utilisant cette approche ici fluent-hibernate-mysql . Il utilise une classe d’utilitaires pour construire la fabrique de sessions à partir de la bibliothèque fluent-hibernate .
Didacticiel Hibernate 5 incorrect
Il existe un exemple incorrect dans le tutoriel Hibernate 5 1.1.6. Startup et aides . Il utilise ce code
return new Configuration().configure().buildSessionFactory(
new StandardServiceRegistryBuilder().build() );
Il ne fait pas une configuration appropriée.
Dans Hibernate 5, vous devez compiler StandardServiceRegistry
et Metadata
pour compiler SessionFactory
. Vous pouvez utiliser la HibernateUtil
suivante pour construire SessionFactory
. hibernate.cfg.xml
devrait être à la racine du classpath de votre application.
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;
}
}
De plus, si vous utilisez Hibernate 5 et utilisez @Id
comme stratégie de génération d'identifiant, utilisez GenerationType.AUTO
pour récupérer le générateur d'identité "séquence" par défaut avec MySQL, ce qui vous donnera une exception com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'SampleDB.hibernate_sequence' doesn't exist
, si vous ne l'avez pas. configuré dans vos entités aux attributs d'identifiant. Donc, avec Hibernate 5, utilisez plutôt GenerationType.IDENTITY
.
Assurez-vous que vous avez créé le fichier de mappage User.hbm.xml ou le fichier User.xml et inclus ce fichier dans hibernate.cfg.xml.
En utilisant ceci:
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
Session session = sessionFactory.openSession();
au lieu de cela:
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Session session = factory.openSession();
résolu le problème avec Hibernate 5.2.10.Final.
Vous n'avez pas ajouté de fichier de configuration
configuration.configure("/hibernate.cfg.xml");
Je faisais face au même problème et j'ai cherché pendant près de 2 heures et essayé de différentes manières, comme le remplacement de vieux bocaux en veille prolongée et la modification du schéma de la table db. Mais finalement obtenu la solution comme ci-dessous;
//This line to be replaced with below commented line
SessionFactory factory = new Configuration().configure().buildSessionFactory();
Remplacer ci-dessus pour
Configuration config = new Configuration().configure();
ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
SessionFactory factory = config.buildSessionFactory(servReg);
Cela fonctionnera alors très bien ..