2012-08-17 3 views
2

JPA를 통해 트리 구조를 저장하고 싶습니다. 모델은 TreeVertex의 두 엔티티 클래스로 구성됩니다. Class Vertex은 기본적으로 정점의 이름 인 클래스 Tree을 포함하며 각 자식 정점 (child -> parent)에 대한 부모 정점을 저장하는 parents이라는 매핑이 지정됩니다.JPA를 통해 트리 구조를 저장하는 방법은 무엇입니까?

이 구조는 주어진 하위 꼭지점에 부모 꼭지점이 있는지 여부와 실제 부모가있는 경우 정보에 간단하고 빠르게 액세스 할 수있게 해줍니다. 나는 같은 부모와 두 아이의 정점을 저장할 수 없습니다 위의 매핑을 사용하여, 불행하게도

@MapKeyClass(Vertex.class) 
@MapKeyJoinColumn(name = "child_id", nullable = false) 
@OneToMany(targetEntity = Vertex.class, cascade = CascadeType.ALL) 
@JoinTable(name = "bug_492_tree_parents", inverseJoinColumns = { @JoinColumn(name = "parent_id") }) 
private final Map<Vertex, Vertex> parents = Maps.newHashMap(); 

:

나는 JPA (내 경우는 EclipseLink가) 관계를 저장하는 방법을 지정하기 위해 다음과 같은 주석을 사용 , V = {parent, child1, child2}E = {{child1, parent}, {child2, parent}} (따라서, child1 -> parentchild2 -> parent) 내가 무결성 제약 조건 위반을 얻을 수 있기 때문에 같은 :

Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '3-4' for key 'PRIMARY' 
Error Code: 1062 
Call: INSERT INTO bug_492_tree_parents (parent_id, tree_id, child_id) VALUES (?, ?, ?) 

이 어떻게 JPA /는 EclipseLink의 특별한 경우의에 의해 발생 조인 테이블의 s의 기본 키 :

Incorrect primary key definition

불행하게도는 EclipseLink는 기본 키로 복합 키 (tree_id,parent_id)를 choses. 이 기본 키를 사용하면 위의 간단한 예제와 같은 부모 모서리를 가진 두 개의 다른 자식 정점이 포함 된 트리를 저장할 수 없습니다.

만 후 수동으로 내가 그 나무 저장할 수 있어요 (tree_id,child_id)에 (MySQL 데이터베이스 스키마의) 기본 키를 고정 : 나는 많은 다른 매핑을 시도

Fixed primary key

을; 그러나, 나는 항상 (다른) 문제들에 빠져 든다.

마지막으로, 내 질문 : 어떻게 JPA를 통해 간단한 트리 구조를 저장해야합니까? 다른 매핑을 선택해야합니까? 모델을 변경해야합니까?

답변

0

저는 JPA가 당신이하려는 일을 할 수 있다고 생각하지 않습니다. E JPA라는 엔티티가 기대 말에지도를 놓을 때

당신은지도에 대한 K로 V의 특정 속성을 사용하지

K와 V.

사이 E와 V 사이의 OneToMany 관계를 구축 할 가장 쉬운 해결책은지도를 잊어서 최상위 노드 만 포함하는 클래스에 List<Vertex>을 넣으면 정점 사이의 자식 부모 관계에 대해 Vertex 클래스에 List<Vertex>을 넣는 것입니다.

@Entity 
VertexRelation { 
    private Vertex parent; 
    private Vertex child; 
    ... 
} 

이 그런 다음지도가 Map<Vertex, VertexRelation> 될 수 있고 당신이 원하는 JPA에게 @MapKey(name="parent")을 사용할 수 있습니다 : 당신은 당신이 지금 가지고있는 이상과 같은 구조를 원하는 경우

난 당신이 같은 추가 개체를 도입해야합니다 생각 부모를지도의 키로 사용합니다.

참고 : 추가 엔티티를 사용하는 것은 아이디어 일 뿐이며 결코 직접 시도하지 않았습니다. 저는 항상 나무에 대한 제 첫 제안과 같은 것을 사용했습니다.

관련 문제