web-dev-qa-db-ja.com

HibernateException: 'hibernate.dialect'が設定されていない場合、DialectResolutionInfoへのアクセスをnullにすることはできません

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) 

しかし、メインクラスでは必須プロパティが設定されています。プログラムが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();
    }
}
}

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;
}
14
Sameer Azeem

構成、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()というステップを見逃しました。

24
Jimmy

これは古い質問のようですが、4.3.1の最終的なHibernateバージョンを使用しているときに、この問題に遭遇しました。多くの答えを読んだ後、彼らはドキュメントで実際にそれを気にしていないように見えましたが、ドキュメントを調べて、必要な情報があると思います。 hibernate構成は.propertiesファイルにある必要はありませんが、xmlファイルに含めることもできます。

StandardServiceRegistryBuilderのインスタンスでconfigure()を呼び出す前に、必ずbuild()を呼び出してください。これは、configure()が実際にデフォルトのcfg.xmlファイルから構成をロードし、ビルドが実際にそれを使用するためです。

これを理解するために、あなたは一つのことをすることができます... configure()を呼び出す前に... StandardServiceRegistryBuilderのインスタンスでgetSettings()を呼び出して印刷します...それは地図です。

Cfg.xmlで言及した休止状態のプロパティは表示されません。

configure()を呼び出してgetSettings()マップを印刷します。..表示されます...すべてのプロパティを取得しました。

7
Omkar Patkar

Hibernate 4.3では、設定を行うにはhibernate.propertiesを使用する必要があり、.hbm.xmlファイルを含めるためにのみhibernate.cfg.xmlを使用する必要があるようです。そのため、次の解決策があります。

クラスパスにファイル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>

先端:公式文書はこのような先端を与えなかった、私はそれが非常に悪いことだと思う。

4
Eric Wang

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

また、設定中にプロパティキーの末尾にスペースがあるようです。それらを削除してください。

link に基づいて、これを変更してみてください

configuration.setProperty("hibernate.dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");

configuration.setProperty("dialect", "com.applerao.hibernatesqlite.dialect.SQLiteDialect");
1
Keerthivasan

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

構成オブジェクトは、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;
    }

}
0
zaki

解決策をありがとう。どういうわけか、4.3.5はhibernate.cfg.xmlから接続(Dialect)情報を取得しません。そのためにはhibernate.propertiesファイルを使用してください。

0

これは、パスワードの期限切れなど、他の何らかの理由で方言が接続できない場合にも発生する可能性があります。

原因を明らかにする可能性のある以前の例外を確認してください。

0
sweetfa

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

}
0