繁体   English   中英

Grails.Domain类。 belongsTo.Why?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM