Я хочу установить отношения между моей сущностью «Тег». Отношения являются двунаправленными и сохраняются в моей сущности «TagRelation»:JPA - единственное отношение двунаправленной сущности
Каждая метка должна соотноситься только 1 запись в таблице tag_relations, так как направление отношения не имеет никакого значения. Например, если я ввожу:
"Лес" (тэг 1) < -> "Дерево" (тэг 2)
Я не должна быть возможность вставить взаимосвязи наоборот:
" Дерево»(тэг 1) < -> "Forest"(тэг 2)
Это SQL код таблицы tag_relation:
CREATE TABLE IF NOT EXISTS `tag_relation` (
id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`tag_id_1` INT(10) UNSIGNED NOT NULL ,
`tag_id_2` INT(10) UNSIGNED NOT NULL ,
`type` ENUM('related_subject','synonymous','alternative_writing') NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_tag_1` (`tag_id_1` ASC) ,
INDEX `fk_tag_2` (`tag_id_2` ASC) ,
UNIQUE INDEX `ux_relation_1_2` (`tag_id_1` ASC, `tag_id_2` ASC) ,
UNIQUE INDEX `ux_relation_2_1` (`tag_id_2` ASC, `tag_id_1` ASC) ,
CONSTRAINT `fk_tag_1`
FOREIGN KEY (`tag_id_1`)
REFERENCES `mm`.`tag` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tag_2`
FOREIGN KEY (`tag_id_2`)
REFERENCES `mm`.`tag` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
AUTO_INCREMENT = 1
уникальные индексы, как они теперь не применяют уникальные отношения, которые я хочу. Как это можно сделать в моей базе данных?
Я не эксперт, поэтому может быть лучшее решение. Но если вы считаете, что [tag1, tag2] равен [tag2, tag1], вы можете применить правило, что пара всегда вставлена с наименьшим идентификатором в первом столбце и самым большим идентификатором во втором. Это может быть связано с простым проверочным ограничением. –
Вы имеете в виду триггер? Решение звучит неплохо. Я должен узнать, как написать этот триггер. – BigJ
Я не думаю, что это работает, потому что объект TagRelation уже установил ссылки tag_1 и tag_2. Триггер, который вы предложили, может обернуть его вокруг, когда он вставлен в db, что приводит к несогласованности между тегом TagRelation и базой данных. Но, возможно, я мог бы создать триггер, который проверяет, существует ли в базе данных уникальное отношение. – BigJ