JPA - 独特的双向实体关系

时间:2012-02-10 14:53:48

标签: sql database jpa unique relation

我想在我的“标签”实体之间建立关系。这些关系是双向的,存储在我的实体“TagRelation”中:

enter image description here

每个标记关系在tag_relations表中只应有1个条目,因为关系的方向没有意义。例如,如果我插入:

“森林”(标签1)< - > “树”(标签2)

我不应该以相反的方式插入关系:

“树”(标签1)< - > “森林”(标签2)

这是表tag_relation的SQL代码:

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 :(得分:0)

关系类型是否在运行时动态化?如果不是,我认为你最好将关系直接放在标签中:

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

这将使您的关系更安全,更高效。