Java HibernateeException:当';hibernate.方言';未设定

Java HibernateeException:当';hibernate.方言';未设定,java,hibernate,maven,Java,Hibernate,Maven,使用maven创建Hibernate测试项目 当我运行项目时,它会生成异常: org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections org.

使用maven创建Hibernate测试项目

当我运行项目时,它会生成异常:

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) 
但在主类中设置了必需的属性。不知道为什么程序生成异常

主要类别:

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>

在将配置属性应用于
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");


您没有正确初始化配置、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()

在hibernate 4.3中,似乎需要使用hibernate.properties进行配置, 使用hibernate.cfg.xml仅包括.hbm.xml文件, 因此,以下是解决方案:

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;
    }

}
在类路径中,添加一个文件:hibernate.properties 在这里进行所有配置, e、 g:

#jdbc连接 hibernate.connection.driver\u class=org.postgresql.driver hibernate.connection.url=jdbc:postgresql://localhost:5432/xdm hibernate.connection.username=postgres hibernate.connection.password=123456 #方言 hibernate.dialogue=org.hibernate.dialogue.postgresql82dialogue #c3p0 hibernate.c3p0.min_size=2 hibernate.c3p0.max_size=5 hibernate.c3p0.max_语句=20 hibernate.jdbc.batch_size=10 hibernate.c3p0.timeout=300 hibernate.c3p0.idle\u测试周期=3000 hibernate.c3p0.testConnectionOnCheckout=true #其他 hibernate.show_sql=true hibernate.max_fetch_depth=3 然后,在hibernate.cfg.xml中,只包含.hbm.xml文件, e、 g:



提示:官方文件没有给出这样的提示,我认为这是一件非常糟糕的事情。

谢谢你的解决方案。不知何故,4.3.5没有从hibernate.cfg.xml获取连接(方言)信息,请使用hibernate.properties文件

这似乎是个老问题,但现在当我使用4.3.1最终Hibernate版本时,我也遇到了这个问题。在阅读了许多答案之后,他们似乎真的没有在文档中注意到这一点,但我浏览了文档,我认为他们有必要的信息。hibernate配置不需要位于.properties文件中,但也可以位于xml文件中

在调用
StandardServiceRegistryBuilder
实例上的
build()
之前,只需确保调用了
configure()
。这是因为configure()实际上从默认的cfg.xml文件加载配置,而build实际使用它

要理解这一点,您可以做一件事……在调用
configure()
之前。。。。在
StandardServiceRegistryBuilder
的屏幕上调用
getSettings()
,并将其打印出来……这是一张地图

您将不会看到cfg.xml中提到的任何hibernate属性


现在调用
configure()
并打印
getSettings()
map…您将看到…您已经获得了所有属性。

以下是我在代码中进行的所有配置,而不使用
hibernate.cfg.xml
hibernate.properties
。使用hibernate版本4.3.8.Final进行测试。希望这会有帮助

    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);

正如他所说的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;
    }

}

配置对象正在从
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;
    }

}

如果方言由于任何其他原因(如密码过期)无法连接,也可能发生这种情况


检查可能揭示原因的任何早期异常。

在我的例子中,我试图连接到DB,它是来自Java应用程序的Mysql8+版本。我面临同样的问题。错误日志相同,但失败的原因不同

我在Mysql的my.cnf文件中做了更改,它是:
max connect errors=1000

默认值为100,但不起作用。所以增加到1000,它就开始工作了

如果发生故障,需要详细查看日志。如果日志在任何地方都包含此内容,请尝试此操作

java.sql.SQLException:null,来自服务器的消息:“主机“X”为 由于许多连接错误而被阻止;使用“mysqladmin”取消阻止 刷新主机“


@实体类中的id注释

在我的例子中,在所有正确的配置之后忘记添加@id注释,一旦我添加了注释,它就可以正常工作了

@Entity 
public class demo{

@Id
private long id

}

删除属性末尾的空格IDN不获取哪个空格?有一个空格
configuration.setProperty(“hibernate.dialent(space)”,“com.applerao.hibernatesqlite.dialent.sqlitedialent”)。删除itremoved和相同的结果。您正在尝试连接哪个数据源?你说的方言是什么?当我们想要添加放置在项目目录中的xml配置文件时,会使用自定义oneconfigure(),但我不必使用它,因为我已经在代码中定义了所有配置属性。请在“serviceRegistry”声明后检查。谢谢!我正在跟踪代码片段
new StandardServiceRegistryBuilder().build()
导致我出现此问题的地方。在使用了
applySettings(configuration.getProperties())
之后,它工作了。在hibernate 4.3中,似乎需要使用hibernate.properties来进行confi。是否有任何参考?thanks@okwap我没有找到,但在尝试之后,当使用hibernate单机版时,它是这样工作的。当与spring一起使用时,它是双向工作的。在这种情况下,缺少.hbm.xml。没有这个
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;
    }

}
@Entity 
public class demo{

@Id
private long id

}