看起来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?!现在这肯定是错的
发布于 2010-07-19 18:58:44
根据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"/>发布于 2010-07-19 21:40:57
我希望我的JPA提供者检查这些表是否已经存在,如果不存在就创建它们,但是我找不到上面这个属性的值。
奇怪的是,根据关于toplink.ddl-generation扩展的TopLink软件包文档,create-table应该保持现有的表不变:
TopLink JPA Extensions for Schema Generation
为JPA实体指定您想要的数据描述符语言(DDL)生成操作。要指定DDL生成目标,请参见toplink.ddl-generation.output-mode。
有效值: oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
none -不生成DDL;无模式为generated.create-tables -为不存在的表创建DDL;保持现有表不变(另请参阅toplink.create-ddl-jdbc-file-name).drop-and-create-tables -为所有表创建DDL;删除所有现有表(另请参阅toplink.create-ddl-jdbc-file-name和toplink.drop-ddl-jdbc-file-name).如果您在EJB容器之外使用持久性,并且希望在不创建表的情况下创建DDL文件,则另外定义一个Java system属性INTERACT_WITH_DB并将其值设置为false。
发布于 2010-07-20 00:11:07
Liquibase (http://www.liquibase.org)在这方面做得很好。完全习惯它需要一些时间,但我认为这是值得的。
Liquibase-way独立于您使用的JPA持久性提供程序。实际上,它甚至是数据库不可知的。
https://stackoverflow.com/questions/3279902
复制相似问题