JPA를 통해 트리 구조를 저장하고 싶습니다. 모델은 Tree
및 Vertex
의 두 엔티티 클래스로 구성됩니다. 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 -> parent
및 child2 -> 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의 기본 키 :
불행하게도는 EclipseLink는 기본 키로 복합 키 (tree_id,parent_id)
를 choses. 이 기본 키를 사용하면 위의 간단한 예제와 같은 부모 모서리를 가진 두 개의 다른 자식 정점이 포함 된 트리를 저장할 수 없습니다.
만 후 수동으로 내가 그 나무 저장할 수 있어요 (tree_id,child_id)
에 (MySQL 데이터베이스 스키마의) 기본 키를 고정 : 나는 많은 다른 매핑을 시도
을; 그러나, 나는 항상 (다른) 문제들에 빠져 든다.
마지막으로, 내 질문 : 어떻게 JPA를 통해 간단한 트리 구조를 저장해야합니까? 다른 매핑을 선택해야합니까? 모델을 변경해야합니까?