Система тегов для замены категорий в Spring - Hibernate Java-проект - PullRequest
0 голосов
/ 23 марта 2011

Кто-нибудь знает, как разработать систему тегов, подобную той, что используется здесь, в stackoverflow?

Любые ссылки, которые объяснят, как реализовать эту систему с помощью hibernate / spring, будут замечательными.

Я просто ищу какую-то отправную точку.

Ответы [ 2 ]

2 голосов
/ 23 марта 2011

ответ Арофа на три сущности совершенно верен, но мы делаем то же самое, используя только две сущности, потому что третья (т.е. TaggedPost) не добавляет нам никакой ценности.

Наши сущности выглядят примерно так:

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

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(
            name="PostTag", 
            joinColumns=@JoinColumn(name="TagId"),
            inverseJoinColumns=@JoinColumn(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", 
            joinColumns=@JoinColumn(name="PostId"),
            inverseJoinColumns=@JoinColumn(name="TagId")
    )
    @ForeignKey(name="FK_Post_Tag", inverseName="FK_Tag_Post")
    @Sort(comparator=CompareTagByName.class, type=SortType.COMPARATOR)
    private SortedSet<Tag> tags;

    /* ... */ 

}

Преимущество заключается в том, что нам не нужно вручную поддерживать соединение. Мы просто добавляем или удаляем Tag из каждого Post по мере необходимости.

Примечание также:

  • отложенная загрузка Tag.posts - хорошая идея ... в противном случае вы можете заставить Hibernate без необходимости загружать тысячи Post записей каждый раз, когда отображается тег.
  • объединение «многие ко многим» упрощает сортировку тегов в алфавитном порядке, предоставляя Comparator с аннотацией @Sort
1 голос
/ 23 марта 2011

Я бы предложил начать с трех Entities, один для тегируемого объекта (в случае с примером SO, это будет Post), один для хранения определений вашего тега (вы можете просто назовите это Tag) и один для отображения между двумя (назовите это TaggedPost).

Тогда базовый процесс присвоения Tag для Post выглядит примерно так:

  1. Посмотрите, существует ли уже Tag с данным именем, если да, используйте существующее, в противном случае вставьте новое.
  2. Создайте новый экземпляр TaggedPost, который связывает Post с Tag с шага 1.

Чтобы удалить Tag из Post, просто удалите соответствующий TaggedPost объект.

Вы можете использовать аннотации Hibernate, чтобы представить набор тегов, которые применяются к данному Post, как коллекцию Java, так что вы можете просто сказать getTags(), чтобы получить все теги. И вы можете сделать то же самое на Tag, чтобы вы могли сказать getPosts(), чтобы получить все сообщения, которые имеют Tag.

...