2017-05-24 34 views
0

私は自分のDB表現&で冬眠していることを理解していますか?@OneToMany関係の外部キー制約

私のプロジェクト管理ツールを使用するとProjectが作成され、Phase(s)で構成されます。

私は、リンクテーブルを作成したくないし、私のエンティティで、このようなように進めています:

マイProjectEntity

@OneToMany(mappedBy = "id") 
private Set<PhaseEntity> phases = new HashSet<>(0); 

と私のPhaseEntity

@NotNull 
@ManyToOne(targetEntity = ProjectEntity.class) 
private ProjectEntity project; 

埋めた後、私のPhaseEntityと私を介して保存するDAO

phaseDao.save(phaseEntity);

私は次のエラーを取得する:私はそれを参照してください

ERROR: insert or update on table "phase" violates foreign key constraint "fk8x1x98c4hq4ps0d30y6nxe90u" Detail: Key (phase_id)=(1820) is not present in table "project".

道、私のデータベースに固有のProjectEntityを含む相をプッシュすると、1つのエントリを作成し、別のものを更新する必要があり、最初は私でなければなりませんphaseエントリであり、後者はprojectへの更新で、Setにフェーズを追加する必要があります。

テーブルをprojectテーブルに明示的に保存する必要がありますか? 私の推論の欠陥を見ますか?

答えて

0

知識を共有してください!

"フェーズで構成されるプロジェクト" "フェーズ"テーブルにフェーズを挿入する場合は、同じ 'クラス'カラム値を持つプロジェクトテーブルでロールを持つ必要がありますフェーズテーブルに新しく挿入された行の "クラス"列の値です。

外部キーは、別のテーブルの列(ほとんどの場合、主キー)を参照する列です。外部キーの目的は、データの参照整合性を保証することです。つまり、データベースに表示されるはずの値のみが許可されます。

すべてのプロジェクトを含むプロジェクトテーブルと、すべてのフェーズを含むフェーズテーブルの2つのテーブルがあります。フェーズで構成されたプロジェクト。このロジックを強制するために、フェーズテーブルに外部キーを置き、Projectテーブルのプライマリキーを参照させます。このようにして、PhaseテーブルのすべてのフェーズがPhaseテーブルのプロジェクトに関連していることを確認できます。つまり、Phasesテーブルには、Projectテーブルにないプロジェクトに関する情報を含めることはできません。