【发布时间】:2015-05-13 21:05:05
【问题描述】:
我尝试设置一个 gradle 任务,该任务运行一个旨在生成 SQL 模式的 java 主类。
我没有 persistence.xml 配置文件。
这是我的配置和代码:
我的毕业任务:
task JpaSchemaExport(type: JavaExec){
description "Exports Jpa schema"
dependsOn compileJava
main = "com.bignibou.tools.jpa.JpaSchemaExport"
classpath = sourceSets.main.runtimeClasspath + configurations.compile
}
我的导出工具:
public class JpaSchemaExport {
public static void main(String[] args) throws IOException {
// execute(args[0], args[1]);
execute("default", "build/schema.sql");
System.exit(0);
}
public static void execute(String persistenceUnitName, String destination) {
final Properties persistenceProperties = new Properties();
// XXX force persistence properties : remove database target
persistenceProperties.setProperty(org.hibernate.cfg.AvailableSettings.HBM2DDL_AUTO, "");
persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_DATABASE_ACTION, "none");
// XXX force persistence properties : define create script target from metadata to destination
// persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SCHEMAS, "true");
persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_ACTION, "create");
persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_CREATE_SOURCE, "metadata");
persistenceProperties.setProperty(AvailableSettings.SCHEMA_GEN_SCRIPTS_CREATE_TARGET, destination);
Persistence.generateSchema(persistenceUnitName, persistenceProperties);
}
}
我的数据配置:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setPackagesToScan("com.bignibou.domain");
emf.setDataSource(dataSource);
emf.setPersistenceProvider(new HibernatePersistenceProvider());
emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
emf.setJpaPropertyMap(propertiesMap());
return emf;
}
private Map<String, String> propertiesMap() {
Map<String, String> propertiesMap = new HashMap<>();
propertiesMap.put("hibernate.dialect", hibernateDialect);
propertiesMap.put("hibernate.hbm2ddl.auto", hibernateHbm2ddlAuto);
propertiesMap.put("hibernate.ejb.naming_strategy", hibernateEjbNamingStrategy);
propertiesMap.put("hibernate.connection.charSet", hibernateConnectionCharset);
propertiesMap.put("hibernate.show_sql", hibernateLogSqlInfo);
propertiesMap.put("hibernate.format_sql", hibernateLogSqlInfo);
propertiesMap.put("hibernate.use_sql_comments", hibernateLogSqlInfo);
propertiesMap.put("hibernate.generate_statistics", hibernateGenerateStatistics);
propertiesMap.put("hibernate.cache.use_second_level_cache", hibernateCacheUseSecondLevelCache);
propertiesMap.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory");
propertiesMap.put("javax.persistence.sharedCache.mode", "ENABLE_SELECTIVE");
return propertiesMap;
}
这是我得到的例外:
Exception in thread "main" javax.persistence.PersistenceException: No persistence provider found for schema generation for persistence-unit named default
at javax.persistence.Persistence.generateSchema(Persistence.java:93)
at com.bignibou.tools.jpa.JpaSchemaExport.execute(JpaSchemaExport.java:31)
at com.bignibou.tools.jpa.JpaSchemaExport.main(JpaSchemaExport.java:14)
编辑:我确实收到了警告:
:bignibou-server:JpaSchemaExport
2015-05-16 14:46:44,423 [main] WARN org.hibernate.ejb.HibernatePersistence - HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
2015-05-16 14:46:44,423 [main] WARN org.hibernate.ejb.HibernatePersistence - HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
2015-05-16 14:46:44,423 [main] WARN org.hibernate.ejb.HibernatePersistence - HHH015016: Encountered a deprecated javax.persistence.spi.PersistenceProvider [org.hibernate.ejb.HibernatePersistence]; use [org.hibernate.jpa.HibernatePersistenceProvider] instead.
Exception in thread "main" javax.persistence.PersistenceException: No persistence provider found for schema generation for persistence-unit named default
at javax.persistence.Persistence.generateSchema(Persistence.java:93)
at com.bignibou.tools.jpa.JpaSchemaExport.execute(JpaSchemaExport.java:32)
at com.bignibou.tools.jpa.JpaSchemaExport.main(JpaSchemaExport.java:14)
:bignibou-server:JpaSchemaExport FAILED
【问题讨论】:
-
查看
AvailableSettings类,有一个PROVIDER常量,根据文档是“PersistenceProvider 实现者的名称”。所以也许你也应该设置那个属性。该值应该是HibernatePersistenceProvider类的 FQN,但不幸的是,文档对此并不清楚... -
谢谢。我尝试添加以下行:
persistenceProperties.setProperty(AvailableSettings.PROVIDER, "org.hibernate.jpa.HibernatePersistenceProvider");无济于事... -
你的持久化单元“默认”在哪里定义?
-
@andih:我使用 Spring Boot,但我没有定义任何似乎默认为“默认”的持久性单元名称。
-
根据文档docs.spring.io/spring/docs/current/javadoc-api/org/… 的默认 PersistenceUnit,也根据 JPA 规范是无(空)。尝试设置 PersistenceUnit
emf. setPersistenceUnitName("default");如果“default”是 PersistenceUnit 的默认名称,那么这不应该改变任何东西,否则它定义了一个名为“default”的命名 PersistenceUnit,您已经在引用它。
标签: hibernate jpa gradle hibernate-tools