2011-03-22 1 views

답변

1

Entities으로 시작하는 것이 좋습니다. 태그가있는 객체 (예 :이 경우는 Post), 태그 정의를 유지하는 객체 (이 코드는 Tag), 둘 사이의 매핑을위한 하나 (TaggedPost). 지정된 이름을 가진 Tag이 이미 존재하는 경우 예, 그렇지 않으면 새로 삽입, 기존의 하나를 사용하는 경우

  1. , 참조 :

    그런 다음 할당의 기본 과정은 TagPost A와 같은 간다.

  2. 방금 ​​해당 TaggedPost 엔티티를 삭제하려면 Post에서 Tag을 제거하려면 1 단계

에서 TagPost을 연결하는 새로운 TaggedPost 인스턴스를 만듭니다.

Hibernate 주석을 사용하여 주어진 Post에 적용되는 태그 집합을 Java Collections로 노출하여 모든 태그를 얻는 데 단지 getTags()이라고 말할 수 있습니다. Tag에서 동일한 작업을 수행하면 getPosts()이라고 말하면서 주어진 게시물이 모두 Tag 일 수 있습니다.

1

aroth의 세 엔티티 답변이 완벽하게 유효하지만 세 번째 엔티티 (즉, TaggedPost)가 Google에 어떤 값도 추가하지 않기 때문에 두 엔티티 만 사용하여 동일한 작업을 수행합니다.

우리의 실체는 다음과 같이 보일 :

@Entity 
@Table(name = "Tag") 
public class Tag { 

    @ManyToMany(fetch=FetchType.LAZY) 
    @JoinTable(
      name="PostTag", 
      [email protected](name="TagId"), 
      [email protected](name="PostId") 
    ) 
    @ForeignKey(name="FK_Tag_Post", inverseName="FK_Post_Tag") 
    private Set<Post> posts; 

    /* ... */ 

} 


@Entity 
@Table(name = "Post") 
public class Post { 

    @ManyToMany 
    @JoinTable(
      name="PostTag", 
      [email protected](name="PostId"), 
      inverseJoinCol[email protected](name="TagId") 
    ) 
    @ForeignKey(name="FK_Post_Tag", inverseName="FK_Tag_Post") 
    @Sort(comparator=CompareTagByName.class, type=SortType.COMPARATOR) 
    private SortedSet<Tag> tags; 

    /* ... */ 

} 

장점은 우리가 수동으로 조인을 유지할 필요가 없다는 것입니다. 필요에 따라 각 Post에서 Tag을 추가하거나 삭제하면됩니다. 또한

참고 : Tag.posts

  • lazy 페칭이 ... 좋은 생각이다, 그렇지 않으면 당신은 불필요하게 Post 수천로드 최대 절전 모드가 발생할 수 있습니다는 태그가 표시 될 때마다 기록합니다.
  • 대다 조인이 @Sort 주석
Comparator를 제공함으로써, 알파벳 순으로 태그를 정렬하기가 쉽습니다