看起来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?现在这肯定是错误的
答案 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
none
- 不要生成DDL;没有 架构生成。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 系统属性
INTERACT_WITH_DB
和 将其值设置为false
。
答案 2 :(得分:0)
Liquibase(http://www.liquibase.org)擅长这一点。完全习惯它需要一些时间,但我认为这是值得的。
Liquibase-way独立于您使用的JPA持久性提供程序。实际上,它甚至与数据库无关。