Eclipselink更新现有表

时间:2010-05-31 19:53:44

标签: java orm jpa eclipselink

也许我弄错了但是我虽然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 Warning]: 2010-05-31 14:39:06.044--ServerSession(16053322)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'account' already exists
Error Code: 1050
Call: 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) default 0 NOT NULL, PRIMARY KEY (ID))
Query: 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) default 0 NOT NULL, PRIMARY KEY (ID))")
[EL Warning]: 2010-05-31 14:39:06.074--ServerSession(16053322)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.0.v20100517-r7246): org.eclipse.persistence.exceptions.DatabaseException

在此之后继续以下内容。

我做错了什么或是个错误?

4 个答案:

答案 0 :(得分:33)

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

<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />

答案 1 :(得分:4)

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

  

Using EclipseLink JPA Extensions for Schema Generation

     

以下是有效值   在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-name   和   eclipselink.drop-ddl-jdbc-file-name。)
  •   

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

答案 2 :(得分:2)

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

property name="hibernate.hbm2ddl.auto" value="update"

答案 3 :(得分:1)

create-or-extend-tables可以解决这个问题