现在,我尝试了解 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 的单向关系。主要到次要。是的? 但这与第 2 步相同。但是我们在第 2 步和第 3 步上有不同的域类。 即,方法 belongsTo 不会影响表的结构?
第 4 步:
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 的单向关系。主要到次要。是的? 但这与第 2 步和第 3 步相同。但是我们在第 2 步、第 3 步和第 4 步上有不同的域类。 查看最近的 3 个示例,我们可以得出结论,方法 belongsTo 不会影响表的结构...但是,但是,但是..看这一步
第 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 完全没有区别。
在第 5 步中,您反转了关系的方向,因此 Main
不再知道 Sub
。
关于mysql - Grails.Domain 类。属于。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4285153/