0

JPAを使用してMySQL(プロバイダーとしてのEclipseLink)にデータを永続化する作業中のプロジェクトがあります。最近、データベースを削除し、Eclipse => EclipseLink 'エンティティからテーブルを生成' を介してテーブルを使用して再度作成したいと考えました。また、persistence.xml を更新しました (最初は自動的に生成され、次に手動で変更してこの問題を絞り込みました)。

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>xxx.entity.options.Difficulty</class>
<class>xxx.entity.options.Options</class>

(それ以外はOKなので省略⇒概ね動作しています)

問題は、テーブルを生成するときにエラーが発生することです。

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'xxx.DIFFICULTY' doesn't exist
Error Code: 1146

(エンティティ クラスにはテーブル名が定義されています: @Entity @Table(name = "DIFFICULTY"))

persistence.xml から「Options」をコメントアウトすると、「DIFFICULTY」テーブルが正常に作成されます。次に、'Options' のコメントを再度外し、テーブルを再生成します => 'OPTIONS' テーブルも作成されます (Options は @ManyToOne と難易度に関連付けられています)。

私が持っているpersistence.xmlで

<property name="eclipselink.ddl-generation" value="drop-and-create-tables" />

私はまだ開発中なので。

私が持っているオプションクラスで

@ManyToOne(optional = false, cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
private Difficulty difficulty = null;

(多くのオプションは同じ難易度が選択されていると想定されているため、実際に所有しているものはありません。これが正しいといいのですが?)

難易度テーブルとオプション テーブルが正常に作成された後、残りのデータベース テーブルを再作成することができました。

  1. 問題は、テーブルが作成される順序を指定する (指定できる) べきかということです。
  2. @ManyToOne 関連付けに何か問題がありますか?

この問題にすでに数時間を費やしましたが、何が問題なのかわかりませんでした。

長いテキストで申し訳ありませんが、全体の状況を説明しようとしています。最後に 'tl; を受け取りました。博士;' 回答 (その時までにそれが何を意味するのかわかりませんでした)、私は間違ったことを探すのに 6 時間費やしたので、そのような場合はわざわざ回答しないでください。

4

2 に答える 2

1

例外スタックを見ると、エンティティのデフォルト コンストラクターからのものであることがわかります。このコンストラクターは、entitymanager を取得してクエリを発行しようとしていますが、必要なテーブルがまだ存在しないために失敗しています。その 1 つのテーブルを作成すると、コンストラクターはそれを照会できるため、すべてを続行できます。

デフォルトのコンストラクターにビジネス ロジックを含めないでください。これはプロバイダーによって使用され、デプロイ中に DDL の前に呼び出されます。それを削除すると、問題が解決します。

于 2013-03-05T21:36:18.793 に答える