mysql - Grails.Domain 类。属于。为什么?

标签 mysql grails grails-orm

现在,我尝试了解 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/

相关文章:

hibernate - 如何使用 JPA 和 Hibernate 修复 StaleObjectStateException

grails - 保持从 Grails 域到数据库的列顺序

grails - 如何在HQL/GORM中表达 "where value is in dynamic list"?

mysql - 在不重启服务器的情况下更改mysql变量

mysql - 在多个表中放置唯一索引

mysql - org.apache.tomcat.jdbc.pool.ConnectionPool 放弃

在发布期间指定内容类型时,Grails 无法解析请求

unit-testing - grails,具有指定 ID 的单元测试模拟域

php - 使用php将mysql数据拆分为3个bootstrap md列

php - fatal error :调用未定义的方法 PDOStatement::lastInsertId()