HibernateException:当'hibernate.dialect'未设置时,对DialectResolutionInfo的访问不能为null

Sam*_*eem 15 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.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) 
Run Code Online (Sandbox Code Playgroud)

但是在主类中需要设置属性.不知道为什么程序是genrAating异常.

主类:

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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

知道问题出在哪里?

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;
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*mmy 25

您没有正确初始化configuration,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);
Run Code Online (Sandbox Code Playgroud)

所以在你的代码中,你错过了这一步:configuration.configure().

  • 谢谢!我正在关注[JBoss Hibernate教程](http://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch01.html#tutorial-firstapp-helpers),其中的代码片段是“新的StandardServiceRegistryBuilder ().build()`导致了我这个问题。使用`applySettings(configuration.getProperties())`后,它可以工作了。 (2认同)

小智 8

这似乎是一个老问题,但现在当我使用4.3.1最终的Hibernate版本时,我也遇到了这个问题.在阅读了许多答案后,似乎他们在文档中并没有真正处理它,但我查看了文档,我认为他们有必要的信息.hibernate配置不一定需要在.properties文件中,但它也可以在xml文件中.

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

要理解这一点,你可以做一件事....调用之前configure()....调用getSettings()上的intance StandardServiceRegistryBuilder并打印出来......这是一个地图.

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

现在调用configure()并打印getSettings()地图....你会看到...你已经拥有了所有属性.


Eri*_*ang 5

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

在类路径中,添加一个文件:hibernate.properties并在此处进行所有配置,例如:

#jdbc连接
hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql:// localhost:5432 / xdm
hibernate.connection.username = postgres
hibernate.connection.password = 123456

#方言
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

#其他
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>
Run Code Online (Sandbox Code Playgroud)

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


Kee*_*san 2

在将配置属性应用于设置之前设置配置属性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);
Run Code Online (Sandbox Code Playgroud)

另外,在设置属性键时,它们的末尾似乎有一个空格。请删除它们。

根据链接尝试更改此设置

configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
Run Code Online (Sandbox Code Playgroud)

configuration.setProperty("dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
Run Code Online (Sandbox Code Playgroud)