Проблемы с генерацией sql через eclipseLink - отсутствует разделитель - PullRequest
9 голосов
/ 31 августа 2010

Я использую 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)

Ответы [ 3 ]

5 голосов
/ 20 сентября 2015

Я столкнулся с этой проблемой и решил ее, установив свойство в файле persistence.xml.

Начиная с Eclipselink 2.6, существует свойство "eclipselink.ddlgen-terminate-Statement", которое при значении true устанавливает разделитель.будет добавляться к каждому утверждению.

Я думаю, что в то время я использовал базу данных H2.

Подробнее см. http://www.eclipse.org/eclipselink/api/2.6/org/eclipse/persistence/config/PersistenceUnitProperties.html

3 голосов
/ 31 августа 2010

Токен, используемый для разделения операторов, зависит от используемой платформы DatabasePlatform. Я предполагаю, что вы используете Oracle, так как из кода он кажется единственным, который не использует разделитель, хотя я не уверен, почему.

Каким инструментом вы пользуетесь для выполнения скрипта? Похоже на ошибку, которая ";" не используется для Oracle, пожалуйста, зарегистрируйтесь в EclipseLink и проголосуйте за него.

Чтобы обойти эту проблему, создайте свой собственный подкласс OraclePlatform и переопределите его,

getStoredProcedureTerminationToken() {
  return ";"
}

(пожалуйста, укажите в ошибке, что для DDL должен использоваться другой метод, а не StoredProcedureTerminationToken.

Вы можете установить свою платформу, используя свойство "eclipselink.target-database".

0 голосов
/ 31 августа 2010

Если это один, замените каждый "\ n \ n" на "; \ n \ n".Не рекомендую это как постоянное решение, хотя ...

...