如何通过 Persistence.generateSchema() 生成 DDL?
Posted
技术标签:
【中文标题】如何通过 Persistence.generateSchema() 生成 DDL?【英文标题】:How to generate DDL by Persistence.generateSchema()? 【发布时间】:2015-09-22 07:20:06 【问题描述】:<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="safety" transaction-type="JTA">
<jta-data-source>java:/jdbc/MyDataSource</jta-data-source>
<properties>
<property name="javax.persistence.schema-generation.scripts.action" value="create"/>
<property name="javax.persistence.schema-generation.scripts.create-target" value="create.ddl"/>
<property name="hibernate.default_schema" value="safety"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.mysqlDialect"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.use_sql_comments" value="true"/>
</properties>
</persistence-unit>
</persistence>
这是我的 persistence.xml。如何通过 Persistence.generateSchema() 生成数据库模式?
public class SchemaGenerator
public static void main(String args[])
Map<String, Object> properties = new HashMap<String, Object>();
//adding some properties
Persistence.generateSchema("safety", properties);
它给了我这个错误:org.hibernate.engine.jndi.JndiException: Error parsing JNDI name [java:/jdbc/MyDataSource]。
但是,它不必连接我的数据库,因为我只需要生成 ddl。
【问题讨论】:
我查看了下面的链接。但在我的情况下它不起作用。 github.com/hantsy/ee7-sandbox/wiki/jpa-scripts 您可以注释掉 persistence.xml 中的 jta-data-source 以进行临时修复。 【参考方案1】:您必须将属性connection.provider_class
设置为org.hibernate.service.jdbc.connections.internal.UserSuppliedConnectionProviderImpl
。这样他就不会尝试加载 JNDI 源代码。
这是我的generation.properties
,我使用 Ant Hibernate Tool 进行离线模式生成:
hibernate.dialect=...
hibernate.connection.provider_class=org.hibernate.service.jdbc.connections.internal.UserSuppliedConnectionProviderImpl
javax.persistence.validation.mode=ddl, callback
hibernate.cache.use_second_level_cache=false
hibernate.cache.use_query_cache=false
【讨论】:
我遇到了这个错误。原因:org.hibernate.boot.registry.selector.spi.StrategySelectionException:无法将名称 [org.hibernate.service.jdbc.connections.internal.UserSuppliedConnectionProviderImpl] 解析为策略 [org.hibernate.engine.jdbc.connections.spi .ConnectionProvider] 在这种情况下,我猜您的 Hibernate 版本不包含该提供程序 - 您使用的是哪个版本? 如果我从 persistence.xml 中删除 jta-data-source,它会给我这个错误:线程“main”java.lang.UnsupportedOperationException 中的异常:应用程序必须在 org.hibernate 提供 JDBC 连接。 engine.jdbc.connections.internal.UserSuppliedConnectionProviderImpl.getConnection(UserSuppliedConnectionProviderImpl.java:61)。显然,我的图书馆有那个课程。我正在使用休眠 4.3.10.Final。 你应该检查一下,他为什么打电话给getConnection
。从您的堆栈跟踪 sn-p 中看不到这一点。以上是关于如何通过 Persistence.generateSchema() 生成 DDL?的主要内容,如果未能解决你的问题,请参考以下文章
如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?
如何通过 DBLINK 通过 DBLINK 调用 SELECT?