web-dev-qa-db-ja.com

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警告]: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) NOT NULL、ONLINE TINYINT(1)デフォルト0 NOT NULL、PRIMARY KEY(ID))
クエリ:DataModifyQuery(sql = "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)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 

この後、次のように続きます。

私は何か間違ったことをしているのですか、それともバグですか?

26
javydreamercsw

EclipseLink 2.4以降、永続性ユニットの仕様でこれを使用できます。

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

これは、create-tables値を使用する場合に予想される動作です。 eclipselink.ddl-generationプロパティに関するドキュメントから:

スキーマ生成にEclipseLink JPA拡張機能を使用

persistence.xmlファイルで使用するための有効な値は次のとおりです。

  • none –EclipseLinkはDDLを生成しません。スキーマは生成されません。
  • create-tables – EclipseLinkは、テーブルごとにCREATE TABLESQLの実行を試みます。テーブルがすでに存在する場合、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が必要になる場合があります。

4
Pascal Thivent

Hibernate JPA実装は、まさにあなたが望むことを実行します。その動作を可能にするプロパティは次のとおりです。

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

create-or-extend-tablesはトリックを行います

0
Hamdi Baligh