JPA和toplink create-table如果它们尚不存在?

时间:2010-07-19 09:37:54

标签: java jpa orm persistence.xml

看起来jpa是让我提出很多问题的东西。

添加了这个

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

我的JPA应用程序总是在运行时创建表,这会导致表已存在时出现异常。我希望JPA检查表是否已经存在,如果没有创建它们,但是我找不到上面属性的值。

因此,如果我将其关闭,是否有办法在某些时候手动告诉JPA创建所有表格?

这里更新是我得到的例外

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?现在这肯定是错误的

3 个答案:

答案 0 :(得分:5)

根据http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#Java2DBSchemaGen toplink没有更新现有表格的选项,我不确定我是否会相信它能做正确的事情。 您可以配置toplink以生成sql脚本,然后您必须手动执行以创建所有表。文件名和位置可以像这样配置:

<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"/>

答案 1 :(得分:2)

  

我希望[我的] JPA [provider]检查表是否已经存在,如果没有创建它们,但是我找不到上面属性的值。

很奇怪,根据有关toplink.ddl-generation扩展程序的TopLink Essentials文档,create-table应保持现有表不变:

  

TopLink JPA Extensions for Schema Generation

     

指定数据描述符语言   (DDL)你想要的生成动作   你的JPA实体。指定DDL   生成目标,见   toplink.ddl-generation.output-mode

     

有效值: oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider

           

如果你在外面使用持久性   EJB容器,并希望   创建DDL文件而不创建   表,另外定义了一个Java   系统属性INTERACT_WITH_DB和   将其值设置为false

答案 2 :(得分:0)

Liquibase(http://www.liquibase.org)擅长这一点。完全习惯它需要一些时间,但我认为这是值得的。

Liquibase-way独立于您使用的JPA持久性提供程序。实际上,它甚至与数据库无关。