HibernateException: доступ к DialectResolutionInfo не может быть нулевым, если "hibernate.dialect" не установлен
Создание тестового проекта Hibernate с использованием maven.
когда я запускаю проект, он генерирует исключение:
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)
Но в основном классе требуются свойства set.don't знают, почему программа genrAating exception.
Основной класс:
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();
}
}
}
В файле 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>
Любая идея, где проблема может быть?
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;
}
Ответы
Ответ 1
Вы не правильно инициализировали конфигурацию, serviceRegistry и sessionFactory.
Из Hibernate 4.3.2. Final, StandardServiceRegistryBuilder. Следуйте этому порядку, чтобы инициализировать, например.
Configuration configuration = new Configuration();
configuration.configure("com/jeecourse/config/hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Итак, в вашем коде вы пропустили шаг: configuration.configure()
.
Ответ 2
Кажется, это старый вопрос, но теперь, когда я использую финальную версию Hibernate 4.3.1, я также столкнулся с этой проблемой. Прочитав много ответов, казалось, что они действительно не позаботились об этом в документации, но я просмотрел документацию, и я думаю, что у них есть необходимая информация. Нет необходимости, чтобы конфигурация спящего режима была в файле .properties, но она также может быть в файле xml.
Просто убедитесь, что вы вызываете configure()
перед вызовом build()
в экземпляре StandardServiceRegistryBuilder
. Это связано с тем, что configure() фактически загружает конфигурацию из файла cfg.xml по умолчанию, и сборка фактически использует его.
Чтобы понять это, вы можете сделать одно... перед вызовом configure()
.... invoke getSettings()
на int StandardServiceRegistryBuilder
и напечатать его... это карта.
Вы не увидите никаких свойств спящего режима, которые вы упомянули в cfg.xml
Теперь вызовите configure()
и распечатайте getSettings()
карту... вы увидите... у вас есть все ваши свойства.
Ответ 3
В hibernate 4.3 кажется, что нужно использовать hibernate.properties для выполнения конфигурации,
используйте hibernate.cfg.xml только для включения файлов .hbm.xml,
так что следующим является решение:
в classpath, добавьте файл: hibernate.properties
и сделать все здесь,
например:
# jdbc connecition
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost:5432/xdm
hibernate.connection.username = postgres
hibernate.connection.password = 123456
# dialect
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.idle_test_period = 3000
hibernate.c3p0.testConnectionOnCheckout = true
# other
hibernate.show_sql = true
hibernate.max_fetch_depth = 3
то в файле hibernate.cfg.xml будут включены только файлы .hbm.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>
<!-- mapping files -->
<mapping resource="hibernate/model/Event.hbm.xml" />
</session-factory>
</hibernate-configuration>
tip: официальный документ не дал никаких советов, как это, я думаю, это очень плохо.
Ответ 4
Задайте свойства конфигурации перед тем, как применить свойства конфигурации к настройкам 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);
Кроме того, кажется, что есть место в конце ключей свойств при их настройке. Удалите их.
На основе ссылки попробуйте изменить этот
configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
к
configuration.setProperty("dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
Ответ 5
Спасибо за решение. Так или иначе, 4.3.5 не принимает информацию о соединении (Dialect) из файла hibernate.cfg.xml, для этого используйте файл hibernate.properties.
Ответ 6
Вот что я сделал, чтобы сделать все конфигурации в коде без hibernate.cfg.xml
или hibernate.properties
. Протестировано с использованием спящего режима 4.3.8. Надеюсь, это было бы полезно.
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);
Ответ 7
Как он говорит о 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;
}
}
Ответ 8
Объект конфигурации считывал все свойства из файла hibernate.cfg.xml
. Но объект StandardServiceRegistryBuilder
не использовал эти свойства.
Это решение сработало для меня. Нижеприведенное утверждение имеет решающее значение при выполнении этой работы:
ServiceRegistry serviceRegistry =
new StandardServiceRegistryBuilder().applySettings(
configuration.getProperties()).build();
Полное решение:
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;
}
}
Ответ 9
Это также может случиться, если диалект не может подключиться по какой-либо другой причине, например, по истечении срока действия пароля.
Проверяйте любые более ранние исключения, которые могут выявить причину.