【发布时间】:2020-05-15 07:47:16
【问题描述】:
我使用hibernate 5.4.15.fianl 版本连接DB2 数据库。创建 SessionFactory 时出现以下错误:
*Exception in thread "main" java.lang.NoSuchMethodError: org/hibernate/engine/spi/SessionFactoryImplementor.getProperties()Ljava/util/Map;
at org.hibernate.engine.query.spi.QueryPlanCache.<init>(QueryPlanCache.java:85)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:259)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:468)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
使用Configuration类对象配置属性,
Configuration config = new Configuration();
config.setProperty("hibernate.connection.driver_class", "com.ibm.db2.jcc.DB2Driver");
config.setProperty("hibernate.connection.url", url);
config.setProperty("hibernate.connection.sslConnection", "true");`enter code here`
String fmtHomeDir = FMTEnvironment.getFMT_HOME_DIR();
String certPath= fmtHomeDir + File.separator + "security" +File.separator +"TGenClientTrust2.jks";
config.setProperty("hibernate.connection.sslTrustStoreLocation",certPath);
config.setProperty("hibernate.connection.sslTrustStorePassword", ****);
config.setProperty("hibernate.connection.username", username);
config.setProperty("hibernate.connection.password", password);
config.setProperty("hibernate.dialect", "org.hibernate.dialect.DB2Dialect");
//optional to fix cmd issue
config.setProperty("hibernate.connection.characterEncoding", "UTF-8");
config.setProperty("hibernate.current_session_context_class", "thread");
// end-cmd issue
config.setProperty(Environment.SHOW_SQL, String.valueOf(false));
// login property
config.setProperty("log4j.logger.org.hibernate.SQL", "info");
config.setProperty("log4j.logger.org.hibernate.type", "trace");
// adding entity annotations
config.addClass(Categories.class);
config.addClass(Functions.class);
我尝试了在网上找到的所有可能的组合来获取 sessionfactory 对象, 1.从上面的配置对象:
Configuration config = legacyBootStraping();
sessionFactory = config.buildSessionFactory();
- BootStrapRegistryBuilder 和元数据
BootstrapServiceRegistryBuilder bootstrapRegistryBuilder = new BootstrapServiceRegistryBuilder();
bootstrapRegistryBuilder.applyClassLoader( ClassLoader.getSystemClassLoader() );
BootstrapServiceRegistry bootstrapRegistry = bootstrapRegistryBuilder.build();
StandardServiceRegistryBuilder standardRegistryBuilder = new StandardServiceRegistryBuilder(
bootstrapRegistry );
standardRegistryBuilder.applySettings(getSettings());
StandardServiceRegistry standardRegistry =standardRegistryBuilder.build();
MetadataSources sources = new MetadataSources( standardRegistry );
sources = getConfigMetadata(sources);
MetadataBuilder metadataBuilder = sources.getMetadataBuilder();
Metadata metadata = metadataBuilder.build()
sessionFactory = metadata.getSessionFactoryBuilder().build();
- 使用 StandardServiceRegistryBuilder 进行配置
Configuration config = getLegacyBootStrapConfig(); // get the above configuration
StandardServiceRegistryBuilder stdServBuilder = new StandardServiceRegistryBuilder();
ServiceRegistry serviceRegistry = stdServBuilder.applySettings(config.getProperties()).build();
sessionFactory = config.buildSessionFactory(serviceRegistry);
每个调用都直接/间接到达休眠类: SessionFactoryImpl 构造函数行:259 --> this.queryPlanCache = new QueryPlanCache( this ); QueryPlanCache --> 调用SessionFactoryImplementor类方法getProperties()
getProperties() 方法不是此类的一部分并获得异常:org/hibernate/engine/spi/SessionFactoryImplementor.getProperties()Ljava/util/Map;
非常感谢您尽早回复。我已经尝试过这里提到的大多数帖子,例如清理以前编译的代码,尝试删除一些持久性类版本等,但对我来说没有任何锻炼。
【问题讨论】: