2016-02-01 3 views
5

У меня есть приложение RCP Eclipse. 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 

Я попытался скомпилировать его с той же спящей кодой конфигурации Java в пустом нормальном проекте Java и работает

  • db: sfOrders.db существует
  • без lConf.addAnnotatedClass (eDocument.class) я получаю ту же ошибку
  • я не могу использовать XML/НВМ конфиги

EDIT: это должно быть что-то с тем, как Hibernate классы нагрузки, как от того, что Я вижу в источниках [Line 113], нет простого Class.forName но classLoaderService: https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/boot/registry/selector/internal/StrategySelectorImpl.java

Я попытался заменить hibernate.dialect с этим:

lConf.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect"); 

Конечно, есть и другие ошибки, поскольку я использую SQLite (а не MySQL), но MySQLDialect правильно найден StrategySelectorImpl.class.

Чтобы быть на 100% уверен, что мой app.sqlite.SQLiteDialect существует я создал код:

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

lClass не является нулевым


EDIT: Я вижу, что спящий режим кэширует какой-то загрузчик, и он пытается найти класс внутри моего проекта Eclipse RCP с JAR вместо основного проекта (в который включен проект с JAR). Я изменил диалект к MySQLDialect.class и следующая ошибка я получил это:

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

eDocument.class существует, но в основном проекте (не проект Eclipse RCP с JAR-файлами [включая спящий режим]). SFLib_1.0.0 - проект с JAR-


EDIT: Таким образом, вопрос, как сделать классы от главного RCP проекта видимого для классов внутри JAR из проекта Eclipse RCP с библиотеками.

поэтому в моем случае BundleLoader.class из SF1.0.0 не может найти класс из основного проекта eDocument.class.

ответ

1

Попробуйте заменить эту строку:

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

С:

lConf.setProperty("dialect", "app.sqlite.SQLiteDialect"); 
+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.SQLiteDialect класс, из того, что я проверил, пакет org.hibernate.dialect находится внутри спящего режима -core-5.0.6.Final.jar, но SQLiteDialect отсутствует Где я могу найти SQLiteDialect по умолчанию, который исходит из спящего режима? (если он существует в спящих JAR)? –

0

проблема решена. Проблема заключалась в видимости пучка. Решение заключалось в том, чтобы добавить в MANIFEST.MF (под вкладкой Runtime), hibernate сопоставленные классы, чтобы сделать их доступными из пакета Eclipse-плагина, где был добавлен hibernate

+0

Можете ли вы более подробно сказать об этом ответе, возможно, с помощью кода? У меня такая же проблема, и я не понимаю вашего решения. – BadZen

+0

Сначала я настоятельно НЕ рекомендую использовать SQLite с Hibernate, поскольку поддержка SQLite отсутствует. Я добавил hibernate, сопоставленный с объектами/классами базы данных, с MANIFEST.MF/runtime/Exported Packages и начинает работать. Поэтому, если вы хотите иметь спящий JAR в другом плагине/пакете Eclipse, все отображаемые объекты должны быть видимыми для этого пакета. –

0

Похоже, что коллекция ClassLoaders по умолчанию, с которой начинается Hibernate, имеют доступ к классу «app.sqlite.SQLiteDialect». Поскольку вы загружаете его с ручной конфигурацией, а не только с persistence.xml, тогда решение должно было бы передать ссылку на класс, а не имя. В этом случае было бы лучше, если вы используете загрузку JPA через класс 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.

Смежные вопросы