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

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

添加了这个

 

我的JPA应用程序总是在运行时创建表,这会导致表已存在时出现exception。 我希望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? 现在这肯定是错的

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

      

我想[我的] JPA [提供者]检查表是否已经存在,如果没有创建它们,但是我找不到上面属性的值,这样做。

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

用于架构生成的TopLink JPA扩展

为JPA实体指定所需的数据描述符语言(DDL)生成操作。 要指定DDL生成目标,请参阅toplink.ddl-generation.output-mode

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

  • none – 不生成DDL; 没有生成架构。
  • create-tables – 为不存在的表创建DDL; 保持现有表不变(另请参阅toplink.create-ddl-jdbc-file-name )。
  • drop-and-create-tables – 为所有表创建DDL; 删除所有现有表(另请参阅toplink.create-ddl-jdbc-file-nametoplink.drop-ddl-jdbc-file-name )。

如果在EJB容器外部使用持久性并且想要创建DDL文件而不创建表,则另外定义Java系统属性INTERACT_WITH_DB并将其值设置为false

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

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