2012-02-10 2 views
2

Я хочу установить отношения между моей сущностью «Тег». Отношения являются двунаправленными и сохраняются в моей сущности «TagRelation»:JPA - единственное отношение двунаправленной сущности

enter image description here

Каждая метка должна соотноситься только 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 

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

+1

Я не эксперт, поэтому может быть лучшее решение. Но если вы считаете, что [tag1, tag2] равен [tag2, tag1], вы можете применить правило, что пара всегда вставлена ​​с наименьшим идентификатором в первом столбце и самым большим идентификатором во втором. Это может быть связано с простым проверочным ограничением. –

+0

Вы имеете в виду триггер? Решение звучит неплохо. Я должен узнать, как написать этот триггер. – BigJ

+0

Я не думаю, что это работает, потому что объект TagRelation уже установил ссылки tag_1 и tag_2. Триггер, который вы предложили, может обернуть его вокруг, когда он вставлен в db, что приводит к несогласованности между тегом TagRelation и базой данных. Но, возможно, я мог бы создать триггер, который проверяет, существует ли в базе данных уникальное отношение. – BigJ

ответ

0

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

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

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

+0

Я действительно реализовал решение JB Nizet, которое отлично работает. Я не уверен, понимаю ли я ваше решение. Должно быть возможно иметь несколько отношений одного типа, но я думаю, что отношения тегов в вашем решении можно было бы изменить на список . Но в этом случае JPA создаст 3 таблицы соединений. Тогда было бы проще просто создать один tag_relation. – BigJ

Смежные вопросы