2016-02-01 10 views
5

Eclipse RCPアプリケーションがあります。休止状態のJARは、メインプロジェクトのMANIFEST.MFに含まれている別のプラグインにあります。Hibernate 5 + Eclipse RCP + SQLite 3 - 戦略として名前を解決できませんorg.hibernate.dialect.Dialect

私は、コードを使用して簡単に接続Hibernate -> SQLite DBを確立しよう:

try { 
    Configuration lConf = new Configuration(); 
    lConf.addAnnotatedClass (eDocument.class); 
    lConf.setProperty("hibernate.dialect", "app.sqlite.SQLiteDialect"); 
    lConf.setProperty("hibernate.connection.driver_class", "org.sqlite.JDBC"); 
    lConf.setProperty("hibernate.connection.url", "jdbc:sqlite:sfOrders.db"); 
    lConf.setProperty("hibernate.connection.username", ""); 
    lConf.setProperty("hibernate.connection.password", ""); 

    StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(lConf.getProperties()); 
    _sessionFactory = lConf.buildSessionFactory(builder.build()); 
} catch (Throwable ex) { 
    throw new ExceptionInInitializerError(ex); 
} 

私はカスタムSQLiteDialectを使用して、私はエラーを取得:

java.lang.ExceptionInInitializerError 
    at app.sqlite.DatabaseConnector.connect(DatabaseConnector.java:57) 
    at views.TransactionManagerView$6.widgetSelected(TransactionManagerView.java:144) 
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4362) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1113) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4180) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3769) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1127) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1018) 
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156) 
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:654) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:598) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) 
    at smoothflow.Application.start(Application.java:25) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:669) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:608) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1515) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1488) 
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189) 
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:217) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189) 
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352) 
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111) 
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) 
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418) 
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:692) 
    at app.sqlite.DatabaseConnector.connect(DatabaseConnector.java:55) 
    ... 29 more 
Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [app.sqlite.SQLiteDialect] as strategy [org.hibernate.dialect.Dialect] 
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:113) 
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveDefaultableStrategy(StrategySelectorImpl.java:162) 
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveDefaultableStrategy(StrategySelectorImpl.java:126) 
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.resolveStrategy(StrategySelectorImpl.java:120) 
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.constructDialect(DialectFactoryImpl.java:74) 
    at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:51) 
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) 
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) 
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88) 
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234) 
    ... 42 more 

私は同じHibernate設定のJavaコードでそれをコンパイルしようとしました空の通常のJavaプロジェクトで動作しています。

  • db:sfOrders.db それが道となるものでなければなりません何からと負荷クラスを休止:私は、XML/HBMのコンフィグを使用

EDITカント

  • 同じエラーを取得しlConf.addAnnotatedClass(eDocument.class)なし
  • が存在します

    :私はこれでhibernate.dialect置き換える試してみました https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/StrategySelectorImpl.java

    :私はシンプルにClass.forNameしかしclassLoaderServiceがない、ソース[ライン113]に表示します10

    もちろん、SQLite(MySQLではなく)を使用しているにもかかわらず、MySQLDialectがStrategySelectorImpl.classによって正しく検出されるため、他のエラーがあります。

    Class lClass = Class.forName("app.sqlite.SQLiteDialect"); 
    

    lClassは


    がEDIT nullではない: 私はHibernateはいくつかの種類をキャッシュしていることがわかり、私のapp.sqlite.SQLiteDialectは、私は、コードを作成存在していることを100%確認する

    JARを含むプロジェクトがメインプロジェクト(JARを含むプロジェクトが含まれています)ではなく、JARを使用して自分のEclipse RCPプロジェクト内でクラスを見つけようとします。私はMySQLDialect.classに方言を変更し、私が得た次のエラーがある:

    ClassNotFoundException: app.eCommerceCalls.eDocument cannot be found by SFLib_1.0.0 
    

    eDocument.classは存在するが、メインプロジェクトでは(ない[休止状態を含む]のJARファイルとのEclipse RCPプロジェクトで)。 SFLib_1.0.0 - JARファイルとプロジェクト


    EDIT: そこで問題は、ライブラリとのEclipse RCPプロジェクトからJAR内のクラスのための主要なRCPプロジェクトからクラスを見えるようにする方法、です。

    私の場合、SF1.0.0のBundleLoader.classはメインプロジェクトeDocument.classからクラスを見つけることができません。

    lConf.setProperty("hibernate.dialect", "app.sqlite.SQLiteDialect"); 
    

    付:問題が解決され

    lConf.setProperty("dialect", "app.sqlite.SQLiteDialect"); 
    
  • 答えて

    1

    は、このラインを交換してください。問題はバンドルの可視性にありました。ソリューションはMANIFEST.MF(ランタイムタブの下)に追加して、マッピングされたクラスを休止し、hibernateが追加されたバンドルEclipseプラグインからアクセスできるようにしました。

    +0

    私は試みましたが、同じエラーが発生しました: org.hibernate.boot.registry.selector.spi.StrategySelectionException:名前[org.hibernate.dialect.SQLiteDialect]を戦略として解決できません[org.hibernate.dialect.Dialect ] –

    +0

    @BartekSzczypien hibernate.dialectを方言に置き換えようとします:befor exを見てください: – Abdelhak

    +0

    私はorg.hibernate.dialectをチェックしたorg.hibernate.dialect.SQLiteDialectクラスを持っていません。 -core-5.0.6.Final.jarしかしSQLiteDialectがありません hibernateのデフォルトのSQLiteDialectはどこにありますか? (ハイバネートJARに存在する場合)? 「hibernate.dialect」は を設定していないときDialectResolutionInfoへ のアクセスは私が空にチェックインしたとして、それが動作する必要がありますnullにすることはできません。 –

    0

    +0

    あなたはこの解答をもっと明白にすることができますか?私は同様の問題を抱えており、あなたの解決策を理解していません。 – BadZen

    +0

    まず、SQLiteをサポートしていないので、HibernateでSQLiteを使用することを強くお勧めしません。データベースエンティティ/クラスにマッピングされた休止状態をMANIFEST.MF/runtime/Exported Packagesに追加し、作業を開始します。だから、もしあなたが別のEclipse Plugin /パッケージでHibernate JARを使いたいのであれば、マップされたすべてのエンティティがこのパッケージで見えるはずです。 –

    0

    Hibernateで始まるClassLoadersのデフォルトコレクションのようです「app.sqlite.SQLiteDialect」クラスにアクセスできます。 persistence.xmlではなく、手動構成で起動しているので、解決策は名前ではなくクラス参照を渡すことです。その場合、JP1のブートアップをPersistenceクラスから使用して、Persistence.createEntityManagerFactory(String unitName, Map props)を使用する方が良いかもしれません。そうすれば、それは弦を取るだけに限られません。

    JPA-ブートに移動しなければ、これは5.2のために働く必要があります。

    Properties props = new Properties(); 
    Configuration lConf = new Configuration(); 
    lConf.addAnnotatedClass (eDocument.class); 
    props.put("hibernate.dialect", app.sqlite.SQLiteDialect.class); 
    props.put("hibernate.connection.driver_class", "org.sqlite.JDBC"); 
    props.put("hibernate.connection.url", "jdbc:sqlite:sfOrders.db"); 
    props.put("hibernate.connection.username", ""); 
    props.put("hibernate.connection.password", ""); 
    lConf.setProperties(props); 
    lConf.buildSessionFactory(); 
    

    setPropertiesを使用すると、Stringに型キャストをバイパスします。

    関連する問題