2012-02-10 4 views
2

내 "태그"엔터티간에 관계를 만들고 싶습니다. 관계는 양방향이며, 나의 실체 "TagRelation"에 저장됩니다 관계의 방향이 아무 의미가 없기 때문에JPA - 고유 한 양방향 엔터티 관계

enter image description here

각 태그의 관계에만 tag_relations 테이블의 한 항목이 있어야합니다. 예를 들어 나는 삽입하는 경우 :

"숲"(태그 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

저는 전문가가 아니므로 더 나은 해결책이 될 수 있습니다. 그러나 [tag1, tag2]가 [tag2, tag1]과 같다고 생각하면 첫 번째 열에 가장 낮은 ID가 삽입되고 두 번째 열에는 가장 큰 ID가 삽입되는 규칙을 적용 할 수 있습니다. 이것은 단순한 점검 제약에 의해 제한 될 수있다. –

+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의 솔루션을 구현했습니다. 나는 당신의 해결책을 이해하는지 모르겠습니다. 동일한 유형의 다중 관계를 가질 수 있어야하지만 솔루션의 태그 관계를 List 으로 변경할 수 있습니다. 그러나이 경우 JPA는 3 개의 연결 테이블을 생성합니다. 그렇다면 하나의 tag_relation을 직접 작성하는 것이 더 쉬울 것입니다. – BigJ