たぶん私はそれを間違えましたが、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
この後、次のように続きます。
私は何か間違ったことをしているのですか、それともバグですか?
EclipseLink 2.4以降、永続性ユニットの仕様でこれを使用できます。
<property name="eclipselink.ddl-generation" value="create-or-extend-tables" />
これは、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-name
およびeclipselink.drop-ddl-jdbc-file-name
も参照してください。)
したがって、代わりにdrop-and-create-tables
が必要になる場合があります。
Hibernate JPA実装は、まさにあなたが望むことを実行します。その動作を可能にするプロパティは次のとおりです。
property name="hibernate.hbm2ddl.auto" value="update"
create-or-extend-tablesはトリックを行います