[英]Grails.Domain class. belongsTo.Why?
现在,我尝试了解Grails域类和GORM中的工作原理。 所以,我尝试实验:
我尝试了两个域类:Main和Sub。
我们走吧!
第1步:
class Main {
String name;
String value;
}
class Sub {
String name;
String value;
}
看一下MySQL:
CREATE TABLE `main` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `sub` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
结果:预期。 一切都很好。
第2步:
class Main {
String name;
String value;
Sub sub;
}
class Sub {
String name;
String value;
}
看一下MySQL:
CREATE TABLE `main` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`sub_id` bigint(20) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK3305B98FB5DA4E` (`sub_id`),
CONSTRAINT `FK3305B98FB5DA4E` FOREIGN KEY (`sub_id`) REFERENCES `sub` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `sub` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
结果:预期。 一切都很好。 就MySQL而言,我们具有1:1的单向关系。 主到子 是?
步骤3:
class Main {
String name;
String value;
Sub sub;
}
class Sub {
String name;
String value;
static belongsTo = Main
}
看一下MySQL:
CREATE TABLE `main` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`sub_id` bigint(20) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK3305B98FB5DA4E` (`sub_id`),
CONSTRAINT `FK3305B98FB5DA4E` FOREIGN KEY (`sub_id`) REFERENCES `sub` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `sub` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
结果:就MySQL而言,我们具有1:1的单向关系。 主到子 是? 但这与STEP 2上的相同。但是在STEP 2和STEP 3上我们具有不同的域类,即方法belongsTo是否不影响表的结构?
第四步:
class Main {
String name;
String value;
Sub sub;
}
class Sub {
String name;
String value;
static belongsTo = [main:Main]
}
看一下MySQL:
CREATE TABLE `main` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`sub_id` bigint(20) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK3305B98FB5DA4E` (`sub_id`),
CONSTRAINT `FK3305B98FB5DA4E` FOREIGN KEY (`sub_id`) REFERENCES `sub` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `sub` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
结果:就MySQL而言,我们具有1:1的单向关系。 主到子 是? 但这与STEP 2和3相同。但是在STEP 2和STEP 3以及STEP 4上,我们具有不同的域类。请看最近的3个示例,我们可以得出结论,methodTo方法不会影响该类的结构。表...但是,但是,但是..看看这个步骤
步骤5:
class Main {
String name;
String value;
}
class Sub {
String name;
String value;
static belongsTo = [main:Main]
}
看一下MySQL:
CREATE TABLE `main` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `sub` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`version` bigint(20) NOT NULL,
`main_id` bigint(20) NOT NULL,
`name` varchar(255) NOT NULL,
`value` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK1BE407E56D06` (`main_id`),
CONSTRAINT `FK1BE407E56D06` FOREIGN KEY (`main_id`) REFERENCES `main` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
在此示例中,belongsTo影响表的结构,因此这使得belongsTo ???
按照grails文档,belongsTo指示操作如何级联。 这不一定会在数据库中设置级联,但会影响GORM中save()
和delete()
操作的行为。
因此,这回答了为什么STEP2和STEP3之间的SQL绝对没有区别的原因。
在STEP5中,您改变了关系的方向,因此Main
不再了解Sub
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.