6

Looks like jpa is something which makes me ask a lot of questions.

Having added this

<property name="toplink.ddl-generation" value="create-tables"/>

my JPA application always creates tables when running, which results in exceptions in case the tables already exist. I would like JPA to check if the tables already exist and if not create them, however I could not find a value for the property above which does this.

So if I just turn it off, is there a way to tell JPA manually at some point to create all the tables?

Update here's the exception I get

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'tags' already exists
Error Code: 1050
Call: CREATE TABLE tags (ID BIGINT AUTO_INCREMENT NOT NULL, NAME VARCHAR(255), OCCURRENCE INTEGER, PRIMARY KEY (ID))

MySQLSyntaxErrorException?! Now that's wrong for sure

Nils
  • 13,319
  • 19
  • 86
  • 108
  • So did you end up just ignoring the printed exceptions or did you do a work around. – simgineer Sep 12 '12 at 20:33
  • Look at the time when I asked this question.. one way to work around this would probably be to just extend the build script to drop the tables before building / deploying. – Nils Sep 13 '12 at 09:05

3 Answers3

5

According to http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#Java2DBSchemaGen toplink does not have an option to update exiting tables, I'm not sure if I would trust it to do the right thing anyway. You could configure toplink to generate a sql script that you then would have to execute manually to create all tables. The filenames and location can be configured like this:

<property name="toplink.ddl-generation" value="create-tables"/>
<property name="toplink.ddl-generation.output-mode" value="sql-script"/>
<property name="toplink.create-ddl-jdbc-file-name" value="createDDL.sql"/>
<property name="toplink.drop-ddl-jdbc-file-name" value="dropDDL.sql"/>
<property name="toplink.application-location" value="/tmp"/>
Jörn Horstmann
  • 33,639
  • 11
  • 75
  • 118
2

I would like [my] JPA [provider] to check if the tables already exist and if not create them, however I could not find a value for the property above which does this.

Weird, according to the TopLink Essentials documentation about the toplink.ddl-generation extension, create-table should leave existing table unchanged:

TopLink JPA Extensions for Schema Generation

Specify what Data Descriptor Language (DDL) generation action you want for your JPA entities. To specify the DDL generation target, see toplink.ddl-generation.output-mode.

Valid values: oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider

If you are using persistence outside the EJB container and would like to create the DDL files without creating tables, additionally define a Java system property INTERACT_WITH_DB and set its value to false.

Pascal Thivent
  • 562,542
  • 136
  • 1,062
  • 1,124
  • I'm not using EJBs here (and not even an application server) I just noticed some exceptions when running it and with the db already existing, but thx for pointing this out – Nils Jul 19 '10 at 20:10
  • @Nils: I'm not sure to understand your comment. The above applies when using TopLink Essentials as JPA provider in a Java SE environment too and I think you misread the last sentence of the documentation. This answer strictly covers your question here (which was not about updating existing tables). – Pascal Thivent Jul 19 '10 at 20:32
0

Liquibase (http://www.liquibase.org) is good at this. It takes some time to get fully used to it, but I think it's worth the effort.

The Liquibase-way is independent of which JPA persistence provider you use. Actually, it's even database agnostic.

Jan
  • 9,397
  • 13
  • 47
  • 52