如何通过 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过IP获取MAC地址?如何通过mac来获取IP地址?

如何理解“不要通过共享内存来通信,而应该通过通信来共享内存”?

如何通过android上的ADB命令通过pc拨打电话?

如何通过 DBLINK 通过 DBLINK 调用 SELECT?

如何使用jquery通过.load通过跨域获取HTML元素的值

如何通过 Windows Azure 通过 GCM 通过唯一 ID 发送特定 Android 设备的通知?