首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate 5+ Eclipse + SQLite 3-无法将名称解析为策略org.hibernate.dialect.Dialect

Hibernate 5+ Eclipse + SQLite 3-无法将名称解析为策略org.hibernate.dialect.Dialect
EN

Stack Overflow用户
提问于 2016-02-01 22:17:11
回答 3查看 7.6K关注 0票数 5

我有Eclipse应用程序。带有hibernate的JAR在另一个插件中,它包含在MANIFEST.MF的主要项目中。

我尝试使用代码建立简单的连接Hibernate -> SQLite DB:

代码语言:javascript
复制
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并得到错误:

代码语言:javascript
复制
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项目中用相同的hibernate配置Java代码编译它,它可以工作。

  • db: sfOrders.db存在
  • 如果没有lConf.addAnnotatedClass (eDocument.class),我将得到相同的错误
  • 我不能使用xml/hbm吐露

编辑:从我在源代码第113行中看到的Hibernate加载类的方式来看,肯定没有简单的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:

代码语言:javascript
复制
lConf.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");

当然,在我使用SQLite (而不是MySQL)时还有其他错误,但是MySQLDialect是由StrategySelectorImpl.class正确地找到的。

为了100 %确定我的app.sqlite.SQLiteDialect存在,我创建了代码:

代码语言:javascript
复制
Class lClass = Class.forName("app.sqlite.SQLiteDialect");

lClass不为空

编辑:我看到hibernate缓存了某种加载程序,它试图用JAR而不是主项目(其中包含有JAR的项目)在我的Eclipse项目中查找类。我将方言改为MySQLDialect.class,下一个错误是:

代码语言:javascript
复制
ClassNotFoundException: app.eCommerceCalls.eDocument cannot be found by SFLib_1.0.0

eDocument.class存在于主要项目中(在Eclipse项目中没有包含hibernate在内的JAR)。SFLib_1.0.0 -带有JAR的项目

编辑:所以问题是,如何使用库使主RCP项目中的类对JAR中的类可见。

因此,在我的示例中,SF1.0.0中的BundleLoader.class无法从主项目eDocument.class中找到一个类。

EN

回答 3

Stack Overflow用户

发布于 2016-02-01 22:32:23

试着替换这一行:

代码语言:javascript
复制
    lConf.setProperty("hibernate.dialect", "app.sqlite.SQLiteDialect");

通过以下方式:

代码语言:javascript
复制
lConf.setProperty("dialect", "app.sqlite.SQLiteDialect");
票数 1
EN

Stack Overflow用户

发布于 2016-02-02 16:06:31

这个问题已经解决了。问题在于可见性问题。解决方案是将hibernate映射的类添加到MANIFEST.MF (运行时选项卡下),使它们可以从添加hibernate的包Eclipse插件中获得

票数 0
EN

Stack Overflow用户

发布于 2017-06-02 10:52:26

Hibernate开头的ClassLoaders的默认集合似乎无法访问"app.sqlite.SQLiteDialect“类。由于您使用手动配置(而不仅仅是persistence.xml )引导它,那么解决方案将是传递类引用,而不是名称。在这种情况下,最好通过持久性类使用Persistence.createEntityManagerFactory(String unitName, Map props)引导JPA。这样的话,它就不局限于只使用字符串。

如果不转到JPA引导,这应该适用于5.2:

代码语言:javascript
复制
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的类型广播。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35141458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档