これはバグではありません。これは、DDL 生成パターンのデフォルトの動作です。一般的に発生する可能性のあるケースについて説明します。
1st case
: データベースで前にテーブルを作成していません
既存のテーブルを使用せずに最初にアプリケーションをビルドする場合、以前に直面した問題は発生しないと思います (デフォルトの構成値を使用し、アプリケーションを DEV モードに設定する限り)。単刀直入に言うと、以前のような 2 つのモデルがあるとします。
@Entity
public class Userr extends Model {
@Id
public Long id;
public String realName;
@OneToMany
List<Badge> badges;
}
@Entity
public class Badge extends Model {
@Id
public Long id;
@ManyToOne
Userr user;
}
アプリケーションを実行すると、フレームワークは DDL 生成パターンに、接続されたデータベースを調べて and という名前のテーブルがあるかどうかを確認するよう指示する必要がありuserr
ますbadge
。以前にこれらのテーブルを作成したことがないため、フレームワークはこれら 2 つのテーブルをデータベースに自動的に生成します。モデルに基づいて、フレームワークは (PostgreSQL スクリプト) のようなスクリプトを使用してテーブルを生成します。
-- the java class name is 'Userr' generated as 'userr'
CREATE TABLE userr {
-- long on java generated as bigint
id bigint,
-- 'realName' on java generated as 'realname' and string on java generated as varchar whose length 255
realname character varying(255),
-- one to many 'badges' field is not generated
CONSTRAINT pk_userr PRIMARY KEY (id), -- id as primary key
}
-- the java class name is 'Badge' generated as 'badge'
CREATE TABLE badge {
id bigint,
-- 'Userr' Object with MayToOne relation generated as the foreign key to the id on 'userr' table
userr_id bigint,
CONSTRAINT pk_badge PRIMARY KEY (id),
CONSTRAINT fk_badge_userr FOREIGN KEY (userr_id)
REFERENCES userr (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
}
2nd case
: データベースに既存のテーブルがあります
以前に と という名前の 2 つのテーブルがあるuser_account
としbadge
ます。表は次のuser_account
ようになります。
CREATE TABLE user_account {
id bigint,
real_name character varying(100),
CONSTRAINT pk_userr PRIMARY KEY (id),
}
CREATE TABLE badge {
id bigint,
user_id bigint,
CONSTRAINT pk_badge PRIMARY KEY (id),
CONSTRAINT fk_badge_user_account FOREIGN KEY (user_id)
REFERENCES user_account (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
}
次のようなコードを使用することで、以前のモデルを(いくつかの変更を加えて)正しく使用して、現在のテーブルを操作できます。
@javax.persistence.Entity
// define this model as table named 'user_account'
@javax.persistence.Table(name = "user_account")
public class Userr extends Model {
@Id
public Long id;
// define this field as column named 'real_name' whose length is 100
@javax.persistence.Column(name = "real_name", length = 100)
public String realName;
@OneToMany
List<Badge> badges;
}
@javax.persistence.Entity
public class Badge extends Model {
@Id
public Long id;
@ManyToOne
// define this field as column named 'user_id' and
// this act as reference to model 'Userr' using field named 'id' on it
@javax.persistence.JoinColumn(name = "user_id", referencedColumnName = "id")
Userr user;
}
これが、DDL 生成パターンをよりよく理解するのに役立つことを願っています.. :)