これらのクラスは、実用的な理由で省略されています。
class CV {
Date dateCreated
static hasMany=[proposals: Proposal]
}
class Proposal {
String name
Date date_started
static hasMany = [CVs: CV]
static belongsTo = CV
}
Grails は、これら両方のクラスのテーブルを作成し、それらを結合する「cv_proposals」という名前の 3 番目のクラスを作成します。ここまでは順調ですね。CV テーブルと提案テーブルの両方にデータがあり、どちらも自動インクリメントされた「id」値を持っています。すべて良い。
Oracle MySQL Workbench では、結合テーブルに値を手動で追加して、操作するダミー データを取得しようとしています。次のトレースでエラー メッセージが表示されます。
エラー 1452: 子行を追加または更新できません: 外部キー制約が失敗しました (
cvreg_utv
.cv_proposals
, CONSTRAINTFK17D946F55677A672
FOREIGN KEY (cv_id
) REFERENCEScv
(id
))
両方のテーブルに数行のデータがあり、両方を個別に編集できることを確認しました。
テーブルを削除して再作成し、クラスを前後に変更してみた結果、この操作は実行中の Grails アプリケーションを介して行う必要があると確信しました。そこで、このスクリプトをコントローラーに記述して実行します。
def g = CV.get(1)
Proposal proposal = g.addToProposals(new Proposal(
name: "SavingTest",
date_started: new Date())).save()
それでも同じエラーが発生します。これは、特定の CV に関連する提案を定義する正しい方法ではありませんか? ここで何らかの形で多対多接続を使用するのは間違っていますか?
編集:結合テーブルのスキーマ作成スクリプトを追加する
delimiter $$
CREATE TABLE `cv_proposals` (
`proposal_id` bigint(20) NOT NULL,
`cv_id` bigint(20) NOT NULL,
PRIMARY KEY (`cv_id`,`proposal_id`),
KEY `FK17D946F55677A672` (`cv_id`),
KEY `FK17D946F5F7217832` (`proposal_id`),
CONSTRAINT `FK17D946F5F7217832` FOREIGN KEY (`proposal_id`) REFERENCES `proposal` (`id`),
CONSTRAINT `FK17D946F55677A672` FOREIGN KEY (`cv_id`) REFERENCES `cv` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
そしてCV表:
CREATE TABLE `cv` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`user_id` bigint(20) NOT NULL,
`version_name` varchar(255) DEFAULT NULL,
`date_created` datetime NOT NULL,
`last_updated` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `FKC734A9AB992` (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=latin1$$
提案表:
CREATE TABLE `proposal` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`date_ended` datetime NOT NULL,
`date_started` datetime NOT NULL,
`description` varchar(500) DEFAULT NULL,
`name` varchar(500) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1$$
これは私が実行しようとした挿入スクリプトです:
INSERT INTO `cvreg_utv`.`cv_proposals` (`proposal_id`, `cv_id`)
VALUES ('1', '1');