Grails.Domain класс. belongsTo.Why? - PullRequest
1 голос
/ 26 ноября 2010

Теперь я пытаюсь понять, как работает в классе домена 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. т.е. метод принадлежит не влияет на структуру таблицы?

ШАГ 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 самых последних примера, мы можем заключить, что метод ownTo не влияет на структуру таблицы ... но, но, но .. посмотрите на этот ШАГ

ШАГ 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$$

В этом примере, принадлежит к влияет на структуру таблицы, так что делает принадлежит принадлежит ???

1 Ответ

3 голосов
/ 26 ноября 2010

Согласно документации GrailsOt указывает, как каскад операций. Это не обязательно устанавливает каскады в базе данных, но влияет на поведение операций save() и delete() в GORM.

Таким образом, это объясняет, почему нет абсолютно никакой разницы в SQL между STEP2 и STEP3.

В STEP5 вы меняете направление своих отношений, чтобы Main больше не знал о Sub.

...