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”的类加入了它们。到现在为止还挺好。我在 CV 和 Proposal 表中都有数据,它们都有自动递增的“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$$  

还有简历表:

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

0

您手动创建表?有趣的是 cv 表使用 MyISAM 引擎,而其他表使用 InnoDB。

我认为您想对所有表使用 InnoDB,因为该引擎是事务性的。在我的测试中,我也无法创建cv_proposals表,直到我更改了 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=InnoDB AUTO_INCREMENT=101

之后,插件工作顺利。

于 2013-04-02T16:09:46.873 回答