私はSpringとJPAを使用したいです。私はこれを実装してみました:
メインテーブル商人:
@Entity
@Table
public class Merchants {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "merchantId", updatable = false, nullable = false)
private int merchantId;
@Column
private String name;
@OneToMany(mappedBy="merchants")
private List<Terminals> terminals;
@Column
private String login;
}
商人のIDを保持する第2表:
@Entity
@Table
public class Terminals {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private int id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="merchantId")
private Merchants merchants;
@Column
private String mode;
}
私は、コードを展開するときしかし、私は例外を取得します:
Caused by: java.sql.SQLException: Table 'production.terminals' doesn't exist
Query is: alter table terminals drop foreign key FKbemlf2t70j5blgdda69vyl032
私はテーブルのリレーションコードを削除するとテーブルがエラーなしで作成されます。任意の解決策はありますか?
編集:
MariaDB [production]> show tables;
+------------------------------+
| Tables_in_production |
+------------------------------+
| hibernate_sequence |
| merchants |
| terminals |
+------------------------------+
3 rows in set (0.00 sec)
MariaDB [production]>
application.properties
spring.jmx.enabled=false
spring.datasource.jndi-name=java:/global/production
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql = true
spring.jpa.hibernate.ddl-auto = create-drop
request.limit=300000
あなたはここで見ている問題は、あなたの中で定義されているDDL政策に関係していapplication.properties
たファイル。
あなたが使用しているようですcreate-drop
あなたは、セッションが終了した後に、データベーススキーマを破壊し、その後作成するために休止状態に伝えていると。一般的なサポートで次のDDLディレクティブを休止:
- 更新(必要に応じてスキーマを更新します)
- 作成(スキーマを作成し、以前のデータを破壊します)
- ドロップを作成する(作成し、セッションの終了時にスキーマを破壊します)
- なし(無効DDLの扱い)
- 検証(データベースに変更を加えない、スキーマを検証)
いずれにせよ、私が使用して、この出来事を見てきましたcreate-drop
統合テストのためのH2データベースでDDLポリシーを。私はより多く、これを研究する任意の時間を費やしたことがないが、これは発生しません標準のMySQLと同様に、それは、あなたが使用している方言に起因している可能性があります。
特に私の生産の展開に - しかしいずれにしても、私は私のデータベーススキーマを作成または変更するために、HibernateのDDL機能を使用して避ける傾向にあります。それはほとんどのために正常に動作しますが、自動DDL機能を使用すると、多くの厄介な副作用につながることができます。
このように、私はにHibernateのDDL機能を設定する傾向がvalidate
作成からデータ変更へ- -フライウェイ使用すると、すべての必要なスキーマ変更を処理https://flywaydb.org/を。
このように、私は何の変化Iの必要性を実行するために自分自身のSQLスクリプトを実行することができています。私はそれが以下を可能としてフライウェイの使用はずっといい選択肢だと思い:
スキーマ変更の検証。
任意のデータベースの変更を処理するために、安全な方法。
VCS制御スキーマの変更(実際のスクリプト)を有することを可能にします。
一般的に、それは非常によく統合し、私はあなたが見て提案するので、それはセットアップには非常に簡単です。