JPA - уникальные двунаправленные отношения сущностей - PullRequest
2 голосов
/ 10 февраля 2012

Я хочу установить отношения между моей сущностью "Tag". Отношения являются двунаправленными и хранятся в моей сущности "TagRelation":

enter image description here

Каждое отношение тега должно иметь только 1 запись в таблице tag_relations, так как направление отношения не имеет значения. Например, если я вставлю:

«Лес» (тег 1) <-> «Дерево» (тег 2)

У меня не должно быть возможности вставить отношения наоборот:

«Дерево» (тег 1) <-> «Лес» (тег 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

Уникальные индексы в том виде, в каком они есть сейчас, не поддерживают уникальные отношения, которые я хочу. Как я могу применить это в моей базе данных?

1 Ответ

0 голосов
/ 08 сентября 2012

Являются ли типы отношений динамическими во время выполнения? если нет, то я думаю, что вы бы лучше разместили отношения прямо в теге:

public class Tag{
    @OneToOne private Tag related_subject;
    @OneToOne private Tag synonymous;
    @OneToOne private Tag alternative_writing;
    //setters and getters
}

Это сделает ваши отношения более безопасными и еще более производительными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...