Création d'un projet de test Hibernate à l'aide de maven.
quand je lance le projet, il génère une exception:
org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.Java:104)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.Java:71)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.Java:209)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.Java:89)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.Java:206)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.Java:178)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.Java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.Java:1843)
at org.hibernate.hibernatetest.App.main(App.Java:33)
Exception in thread "main" Java.lang.NullPointerException
at org.hibernate.hibernatetest.App.main(App.Java:51)
Mais dans la classe principale, les propriétés requises sont définies.ne sais pas pourquoi le programme génère une exception.
Classe principale:
public class App {
public static void main(String[] args) {
Configuration configuration;
ServiceRegistry serviceRegistry;
SessionFactory sessionFactory;
Session session = null;
try {
configuration = new Configuration();
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
configuration.setProperty("hibernate.dialect ", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
configuration.setProperty("hibernate.connection.url ", "jdbc:sqlite:TailorDB.db");
configuration.setProperty("hibernate.connection.driver_class ", "org.sqlite.JDBC");
configuration.setProperty("hibernate.connection.username ", "");
configuration.setProperty("hibernate.connection.password ", "");
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
session = sessionFactory.openSession();
CustomerModel c = new CustomerModel();
c.setID(5);
c.setNIC_Number("691201631345");
c.setFirstName("Zee");
c.setNumber("55225522");
c.setLastName("Jan");
c.setCustomerCode("Zee-123");
session.beginTransaction();
session.save(c);
session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
} finally {
session.close();
}
}
}
Dans le fichier POM:
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.0.Final</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.7.2</version>
</dependency>
<dependency>
<groupId>com.applerao</groupId>
<artifactId>hibernatesqlite</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
Toute idée où le problème peut être ??
CustomerModel cLass:
@Entity
@Table(name = "Customer")
public class CustomerModel {
@Id
@GeneratedValue
@Column(name = "c_id")
int ID;
@Column(name = "c_code")
String customerCode;
@Column(name = "c_fname")
String firstName;
@Column(name = "c_mname")
String middleName;
@Column(name = "c_lname")
String lastName;
@Column(name = "c_nic")
String NIC_Number;
@Column(name = "c_email")
String email;
@Column(name = "c_pnumber")
String number;
}
Vous n'avez pas initialisé correctement la configuration, serviceRegistry et sessionFactory ..__ De Hibernate 4.3.2.Final, StandardServiceRegistryBuilder est présenté. Veuillez suivre cet ordre pour initialiser, par exemple.
Configuration configuration = new Configuration();
configuration.configure("com/jeecourse/config/hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Donc, dans votre code, vous avez manqué l'étape: configuration.configure()
.
Cela semble être une vieille question, mais maintenant, lorsque j'utilise la version 4.3.1 finale d'Hibernate, j'ai également rencontré ce problème. Après avoir lu de nombreuses réponses, il semblait qu’ils n’en avaient vraiment pas tenu compte dans la documentation, mais j’ai parcouru la documentation et je pense qu’ils ont les informations nécessaires. Il n'est pas nécessaire que la configuration de veille prolongée doive être dans un fichier .properties, mais elle peut également être dans un fichier xml.
Assurez-vous simplement que vous appelez configure()
avant d'appeler build()
sur l'instance de StandardServiceRegistryBuilder
. En effet, configure () charge réellement la configuration à partir du fichier cfg.xml par défaut et la construction l’utilise réellement.
Pour comprendre cela, vous pouvez faire une chose ... avant d'invoquer configure()
.... invoquer getSettings()
sur l'intance de StandardServiceRegistryBuilder
et l'imprimer ... c'est une carte.
Vous ne verrez pas les propriétés d'hibernation que vous avez mentionnées dans le fichier cfg.xml
Maintenant, appelez configure()
et imprimez la carte getSettings()
.... vous verrez ... vous avez toutes vos propriétés.
Dans hibernate 4.3, il semble nécessaire d'utiliser hibernate.properties pour config, Utiliser hibernate.cfg.xml uniquement pour inclure les fichiers .hbm.xml, , Voici la solution:
dans classpath, ajoutez un fichier: hibernate.properties et faites toutes les config ici, e.g:
# jdbc connecition hibernate.connection.driver_class = org.postgresql.Driver hibernate.connection.url = jdbc: postgresql: // hôte local: 5432/xdm hibernate.connection.username = postgres hibernate.connection.password = 123456 # dialecte hibernate.dialect = org.hibernate.dialect.PostgreSQL82Dialect # c3p0 hibernate.c3p0.min_size = 2 hibernate.c3p0.max_size = 5 hibernate.c3p0.max_statements = 20 hibernate.jdbc.batch_size = 10 hibernate.c3p0.timeout = 300 hibernate.c3p0. hibernate.c3p0.testConnectionOnCheckout = true # autre hibernate.show_sql = true hibernate.max_fetch_depth = 3
puis, dans hibernate.cfg.xml, incluez uniquement les fichiers .hbm.xml, e.g:
<?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>
<!-- mapping files -->
<mapping resource="hibernate/model/Event.hbm.xml" />
</session-factory>
</hibernate-configuration>
astuce: le document officiel n'a donné aucune astuce comme celle-ci, je pense que c'est une très mauvaise chose.
Définissez les propriétés de configuration avant d'appliquer les propriétés de configuration aux paramètres de StandardServiceRegistryBuilder
configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
configuration.setProperty("hibernate.connection.url", "jdbc:sqlite:TailorDB.db");
configuration.setProperty("hibernate.connection.driver_class", "org.sqlite.JDBC");
configuration.setProperty("hibernate.connection.username", "");
configuration.setProperty("hibernate.connection.password", "");
serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
En outre, il semble y avoir un espace à la fin des clés de propriété lors de leur définition. Veuillez les supprimer.
Sur la base du link , essayez de changer ceci
configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
à
configuration.setProperty("dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
Voici ce que j'ai fait pour effectuer toutes les configurations dans le code sans hibernate.cfg.xml
ni hibernate.properties
. Testé avec la version 4.3.8.Final d'Hibernate. J'espère que ce serait utile.
Configuration configuration = new Configuration();
Properties properties = new Properties();
properties.put(Environment.DRIVER,
com.mysql.jdbc.Driver.class.getName());
properties.put(Environment.USER, "root");
properties.put(Environment.PASS, "root");
properties.put(Environment.HBM2DDL_AUTO, "create");
properties.put(Environment.DIALECT, MySQL5Dialect.class.getName());
properties
.put(Environment.URL, "jdbc:mysql://localhost/hibernate_test");
properties.put(Environment.SHOW_SQL, true);
configuration.setProperties(properties);
configuration.addAnnotatedClass(Stock.class).addAnnotatedClass(
StockDailyRecord.class);
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
L'objet de configuration lisait toutes les propriétés du fichier hibernate.cfg.xml
. Mais l'objet StandardServiceRegistryBuilder
n'utilisait pas ces propriétés.
Cette solution a fonctionné pour moi. La déclaration ci-dessous est essentielle pour faire ce travail:
ServiceRegistry serviceRegistry =
new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
Solution complète:
package demo.jaxrs.util;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
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();
System.out.println("Properties: " + configuration.getProperties());
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
// Create the SessionFactory from hibernate.cfg.xml
return configuration.buildSessionFactory(serviceRegistry);
}
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;
}
}
Merci pour la solution. En quelque sorte, le 4.3.5 ne prend pas les informations de connexion (dialecte) du fichier hibernate.cfg.xml, utilisez le fichier hibernate.properties pour cela.
Cela peut également arriver si le dialecte ne peut pas se connecter pour une autre raison, telle que le mot de passe a expiré.
Vérifiez toutes les exceptions antérieures pouvant révéler la cause.
Comme il le dit à propos de ServiceRegistry:
package org.phenix.hibernate.main;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
Configuration configuration = new Configuration();
configuration.configure("hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties()).build();
// Create the SessionFactory from hibernate.cfg.xml
return configuration.buildSessionFactory(serviceRegistry);
} 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;
}
}