26

也许我弄错了,但我虽然 JPA 能够更新现有表(模型更改添加列)但在我的情况下不起作用。

我可以在日志中看到 eclipselink 尝试创建它但由于它已经存在而失败。而不是尝试更新以添加它继续进行的列。

<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jwrestling"/>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>
<property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>
<property name="eclipselink.logging.level" value="INFO"/>

这是有变化的表格(添加了在线列)

[EL 警告]:2010-05-31 14:39:06.044--ServerSession(16053322)--异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions .DatabaseException
内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表“帐户”已存在
错误代码:1050
调用:CREATE TABLE 帐户(ID INTEGER NOT NULL、USERNAME VARCHAR(32) NOT NULL、SECURITY_KEY VARCHAR(255) NOT NULL、EMAIL VARCHAR(64) NOT NULL、STATUS VARCHAR(8) NOT NULL、TIMEDATE DATETIME NOT NULL、PASSWORD VARCHAR (255) 非空,在线 TINYINT(1) 默认 0 非空,主键 (ID))
查询:DataModifyQuery(sql="CREATE TABLE account (ID INTEGER NOT NULL, USERNAME VARCHAR(32) NOT NULL, SECURITY_KEY VARCHAR(255) NOT NULL, EMAIL VARCHAR(64) NOT NULL, STATUS VARCHAR(8) NOT NULL, TIMEDATE DATETIME NOT NULL, PASSWORD VARCHAR(255) NOT NULL, ONLINE TINYINT(1) 默认 0 NOT NULL, PRIMARY KEY (ID))")
[EL 警告]:2010-05-31 14:39:06.074--ServerSession(16053322)--异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions .DatabaseException

在此之后,它继续进行以下操作。

我做错了什么还是一个错误?

4

4 回答 4

36

从 EclipseLink 2.4 开始,您可以在持久性单元的规范中使用它:

<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
于 2012-09-21T10:20:20.840 回答
6

这是使用该create-tables值时的预期行为。从有关该eclipselink.ddl-generation属性的文档中:

使用 EclipseLink JPA 扩展生成模式

以下是在文件中使用的有效值persistence.xml

  • none– EclipseLink 不生成 DDL;没有生成模式。
  • create-tables– EclipseLink 将尝试CREATE TABLE 为每个表执行 SQL。如果表已经存在,EclipseLink 将遵循特定数据库和 JDBC 驱动程序组合的默认行为(当CREATE TABLE为已经存在的表发出 SQL 时)。在大多数情况下,会引发异常并且不会创建表。然后 EclipseLink 将继续执行下一条语句。(另见 eclipselink.create-ddl-jdbc-file-name。)
  • drop-and-create-tables– EclipseLink 将尝试DROP所有表,然后CREATE是所有表。如果遇到任何问题,EclipseLink 将遵循特定数据库和 JDBC 驱动程序组合的默认行为,然后继续执行下一条语句。(另见 eclipselink.create-ddl-jdbc-file-nameeclipselink.drop-ddl-jdbc-file-name。)

所以你可能想要drop-and-create-tables

于 2010-05-31T22:12:07.923 回答
2

Hibernate JPA 实现完全符合您的要求。这是启用该行为的属性:

property name="hibernate.hbm2ddl.auto" value="update"
于 2011-01-08T13:51:14.700 回答
0

创建或扩展表可以解决问题

于 2012-12-12T02:28:08.053 回答