【问题标题】:Problems with generating sql via eclipseLink - missing separator通过 eclipseLink 生成 sql 的问题 - 缺少分隔符
【发布时间】:2011-04-06 03:06:55
【问题描述】:

我正在将 eclipseLink 与 jpa 一起使用。 在我的 persistence.xml 中,我定义为生成一个 create.sql 文件。将生成该文件,但缺少每个 sql 语句的“;”分隔符。

是否可以在persistence.xml 中或以其他方式定义分隔符?

persistence.xml 示例:

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<exclude-unlisted-classes>false</exclude-unlisted-classes>

<class>de.company.project.models.User</class>

<properties>
      <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
      <property name="eclipselink.application-location" value="/sql" />
      <property name="eclipselink.create-ddl-jdbc-file-name" value="create.sql"/>
      <property name="eclipselink.drop-ddl-jdbc-file-name" value="drop.sql"/>
      <property name="eclipselink.ddl-generation.output-mode" value="sql-script"/>
</properties>

生成的sql文件示例:

CREATE TABLE app_user (
ID INTEGER NOT NULL, 
last_name VARCHAR(50) NOT NULL,         
username    VARCHAR(15) NOT NULL, 
user_password VARCHAR(50) NOT NULL, 
first_name  VARCHAR(50) NOT NULL, 
PRIMARY KEY (ID))

CREATE TABLE SEQUENCE (
 SEQ_NAME VARCHAR(50) NOT NULL,
 SEQ_COUNT DECIMAL(38), 
 PRIMARY  KEY (SEQ_NAME))

INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) 
values ('SEQ_GEN_TABLE', 0)

【问题讨论】:

  • @editors:感谢销毁persistence.xml -.-

标签: java sql jpa eclipselink persistence.xml


【解决方案1】:

如果是一次性的,请将每个“\n\n”替换为“;\n\n”。不建议将此作为永久解决方案...

【讨论】:

  • 以上表格仅为示例。该数据库将在具有许多用户的项目中增长。因此,手动替换换行符是不切实际的
【解决方案2】:

用于分隔语句的标记取决于所使用的 DatabasePlatform。 我假设您使用的是 Oracle,因为从代码来看,它似乎是唯一不使用分隔符的,尽管我不确定为什么。

你使用什么工具来执行脚本?似乎是一个“;”的错误未用于 Oracle,请将此 bu 登录到 EclipseLink 并投票。

要解决此问题,请创建您自己的 OraclePlatform 子类并覆盖,

getStoredProcedureTerminationToken() {
  return ";"
}

(请在错误中包含应该对 DDL 使用不同的方法,而不是 StoredProcedureTerminationToken。

您可以使用“eclipselink.target-database”属性设置您的平台。

【讨论】:

  • 嗨,为测试设置“eclipselink.target-database”属性没有帮助。我正在使用 postgreSQL 并且没有指定“eclipselink.target-database”属性。 jpa 应该使用 JDBC 提供的元数据来自动设置这个值来确定目标数据库。
  • 很遗憾,&lt;property name="eclipselink.target-database" value="Oracle"/&gt; 没有帮助...
  • 拯救了我的一天!你要做的就是创建一个 OraclePlatform 的子类,将受保护的变量 storedProcedureTerminationToken 设置为 ;,并将其限定名称用于属性 eclipselink.target-database
【解决方案3】:

我遇到了这个问题,通过在persistence.xml中设置一个属性解决了。

从 Eclipselink 2.6 开始,有一个属性“eclipselink.ddlgen-terminate-statements”,当设置为 true 时,每个语句都会附加一个分隔符。

我想我当时正在使用 H2 数据库。

更多详情请见http://www.eclipse.org/eclipselink/api/2.6/org/eclipse/persistence/config/PersistenceUnitProperties.html

【讨论】:

  • 这似乎不适用于 oracle,因为 OraclePlattform 定义了“”的 storedProcedureTerminationToke
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多