6

プログラムで何も設定せずConfiguration configuration = new Configuration().configure();、hibernate.properties (以下のように) を呼び出して使用すると、すべてがうまく機能します。プログラムでユーザー名、パスワード、および接続 URL を提供しようとするとすぐに、hbm ファイルを示唆する奇妙な例外が発生します。何が欠けていますか?

この作品

hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://myEC2/mCruiseOnServerDB?autoReconnect=true&failOverReadOnly=false&maxReconnects=10
hsqldb.write_delay_millis=0
shutdown=true
hibernate.connection.username=root
hibernate.connection.password=mypwd
hibernate.connection.pool_size=2
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
hibernate.c3p0.idle_test_period=300
hibernate.c3p0.timeout=120

@Kshitijの推奨に従って。混合モードを実行します。

hibernate.propertiesは現在

hibernate.connection.driver_class=com.mysql.jdbc.Driver
hsqldb.write_delay_millis=0
shutdown=true
hibernate.connection.pool_size=2
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

コード

String connection = "jdbc:mysql://"
            + Globals.DBSERVER
            + "/mCruiseOnServerDB?autoReconnect=true&failOverReadOnly=false&maxReconnects=10";
        Configuration configuration = new Configuration()   
            .setProperty("hibernate.connection.url", connection)                                
            .setProperty("hibernate.connection.username", Globals.DB_USER_NAME)     
            .setProperty("hibernate.connection.password", Globals.DB_PASSWORD);
        configuration.configure();

        sessionFactory = configuration
                .buildSessionFactory(new ServiceRegistryBuilder()
            .buildServiceRegistry());

例外

mapping resourcehbm ファイルのエントリごとに 1 つずつ、この例外が発生します。

11 May 2013 08:46:31,969 1300 [main] FATAL ReadOnlyOperations  - Have chosen to ignore this runtime exception java.lang.UnsupportedOperationException: The application must supply JDBC connections, may be fatal, examine this carefully
11 May 2013 08:46:31,969 1300 [main] FATAL ReadOnlyOperations  - java.lang.UnsupportedOperationException: The application must supply JDBC connections

概要

すべてを使用し、コードを使用しhibernate.propertiesない場合 (コードに .setProperty を使用しない場合)、すべてがうまく機能します。一部hibernate.propertiesおよび一部のコード (サーバー、ユーザー名、パスワード) を使用すると、すべてのマッピング プロパティの hbm でエラーが発生します。

何が欠けているのかを理解するのを手伝ってくれる人が必要です。それは本当に基本的なものでなければなりません。

4

3 に答える 3

3

うわー、ちょうど問題を修正しました。

sessionFactory = configuration.buildSessionFactory(new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry());

私は欠けていた

.applySettings(configuration.getProperties())

学び

  1. configure() は setProperty の後に呼び出す必要があります
  2. 使用し、使用する場合は使用hibernate.connection.urlないでください connection.urlhibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
  3. 休止状態ログの log4j プロパティを ALL に設定して、より詳細な問題を確認できるようにします。
  4. を取り除くには、cfg.xmlとすべてのhbmファイルもWARN Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!置き換える必要があります。hbmファイルも同じ DTD を使用していることを忘れないでください。http://www.hibernate.org/dtd/

最後に、これを参照して、これを修正します。さんの最後のアドバイスBill Gorderは素晴らしいです。

private static SessionFactory configureSessionFactory()    
        throws HibernateException {    
    Configuration configuration = new Configuration();    
    configuration.configure();    
    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()    
            .applySettings(configuration.getProperties())    
            .buildServiceRegistry();    
    return configuration.buildSessionFactory(serviceRegistry);    
}  
于 2013-05-13T10:00:44.703 に答える
0

接続パラメーター (URL、ユーザー名、パスワード) をプログラムで設定している場合でも、アプリケーションの起動時に JDBC 接続の使用を強制する他の条件が存在しないことを確認する必要があります。少なくとも 2 つを特定しました。

  1. hibernate.hbm2ddl.autoプロパティを「none」以外の値に設定すると、起動時に DB への接続が強制されます。DB スキーマを検証、作成、または更新するには...

  2. hibernate.cfg.xml または persistence.xml で C3P0 プロパティを使用している場合、これにより、起動時にプーリング マネージャーが DB から接続を取得しようとすることも強制されます。

これらすべてのケースで、接続パラメーターを構成せずに DB への接続を強制したため、さまざまなエラー (直面したエラーなど) が発生します...

これらのエラーを修正するには、プロパティを無効にするか ( hibernate.hbm2ddl )、他のプロパティもプログラムで設定します ( hibernate.c3p0.* ) 。

于 2014-04-04T17:10:28.333 に答える
0

別の方法は、すべてのプロパティをロードするhibernate.cfg.xmlhibernate.properties、プログラムで必要なプロパティのみを上書きすることです。

Configuration config = new Configuration().configure();
config.setProperty("hibernate.connection.username", "xyz" );
config.setProperty("hibernate.connection.password", "password" ); 
于 2013-05-10T11:38:25.410 に答える