0

これらのクラスは、実用的な理由で省略されています。

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, CONSTRAINT FK17D946F55677A672FOREIGN KEY ( cv_id) REFERENCES cv( 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');
4

1 に答える 1