【发布时间】:2015-05-07 14:59:15
【问题描述】:
我一定遗漏了一些东西:尝试从 Hibernate 4 / JPA 2.1 生成 DDL 脚本。做了研究,发现以下代码失败并出现“应用程序必须提供 JDBC 连接”错误:
public class JpaSchemaExport {
public static void main(String[] args) throws IOException {
execute(args[0], args[1]);
System.exit(0);
}
public static void execute(String persistenceUnitName, String destination) {
System.out.println("Generating DDL create script to : " + 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, null);
Persistence.generateSchema(persistenceUnitName, persistenceProperties);
}
}
问题是,如果只需要生成 DDL(而不是将其应用于 DB),为什么还要尝试连接到 DB?是否需要设置一个 JPA 属性来告诉它不要连接到数据库?
任何帮助将不胜感激。
这是堆栈跟踪:
Exception in thread "main" java.lang.UnsupportedOperationException: The application must supply JDBC connections
at org.hibernate.engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl.getConnection(UserSuppliedConnectionProviderImpl.java:61)
at org.hibernate.jpa.internal.schemagen.JpaSchemaGenerator$ConnectionProviderJdbcConnectionAccess.<init>(JpaSchemaGenerator.java:695)
at org.hibernate.jpa.internal.schemagen.JpaSchemaGenerator$ConnectionProviderJdbcConnectionAccess.<init>(JpaSchemaGenerator.java:686)
at org.hibernate.jpa.internal.schemagen.JpaSchemaGenerator.determineAppropriateJdbcConnectionContext(JpaSchemaGenerator.java:413)
at org.hibernate.jpa.internal.schemagen.JpaSchemaGenerator.access$100(JpaSchemaGenerator.java:69)
at org.hibernate.jpa.internal.schemagen.JpaSchemaGenerator$Generation.execute(JpaSchemaGenerator.java:122)
at org.hibernate.jpa.internal.schemagen.JpaSchemaGenerator.performGeneration(JpaSchemaGenerator.java:76)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$3.perform(EntityManagerFactoryBuilderImpl.java:822)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.generateSchema(EntityManagerFactoryBuilderImpl.java:807)
at org.hibernate.jpa.HibernatePersistenceProvider.generateSchema(HibernatePersistenceProvider.java:172)
at org.hibernate.ejb.HibernatePersistence.generateSchema(HibernatePersistence.java:79)
at javax.persistence.Persistence.generateSchema(Persistence.java:87)
at com.cvc.adservice.config.JpaSchemaExport.execute(JpaSchemaExport.java:55)
at com.cvc.adservice.config.JpaSchemaExport.main(JpaSchemaExport.java:26)
这里是persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="DAI" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!-- <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> -->
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
</properties>
</persistence-unit>
【问题讨论】: