2010-03-23 2 views
0

Ruby on Rails имеет полиморфные отношения, которые действительно полезны для реализации таких функций, как комментирование, тегирование и рейтинг, чтобы назвать несколько. У нас может быть комментарий, тег или рейтинговый класс, который имеет много к одному полиморфному отношению с комментарием, taggable и rateable object. Кроме того, данный объект домена может реализовать любую комбинацию таких отношений. Таким образом, он может, например, быть заметным, taggable и rateable одновременно.Моделирование множественных полиморфных отношений с использованием Hibernate

Я не мог придумать простой способ дублирования этой функции в Hibernate. В идеале, будет класс Comment, который будет иметь отношение «много к одному» с классом Commentable, а класс Commentable будет иметь отношение «один к большому» с комментариями. Это будет идеально, если конкретные классы домена могут наследовать от ряда таких классов, например Commentable и Taggable. Вещи кажутся немного сложными, поскольку класс Java может распространять только один класс, а некоторый код может быть дублирован по нескольким классам.

Я хотел бы знать, какие лучшие методы моделирования таких отношений аккуратно и лаконично используют Hibernate?

+0

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html – Bozho

+0

Обновление: возможно моделировать полиморфное отношение «много-к-одному» от комментария к любому объекту домена используя аннотацию @Any, но моделирование отношения «один ко многим» от этого объекта домена обратно к комментарию приводит к проблемам ограничения внешнего ключа. http://bit.ly/9pPsvk также упоминает, что невозможно указать ограничение FK. Я не вижу обходного пути. Самый близкий рабочий подход, который я нашел, был http://bit.ly/9PfIhR, где у меня есть отдельный подкласс комментариев для каждого объекта комментария, но, по крайней мере, уйти с единой таблицей комментариев. – user299703

ответ

0

Мне кажется, что ваш вопрос не является спящим, но больше по строкам «как я могу обойти единую модель наследования?»

Если реализация интерфейсов - это не то, что вы имеете в виду. AOP (Аспектно-ориентированное программирование) может предоставить вам способ сделать то, что вы пожелаете.

+1

Я искал конкретный ответ Hibernate на мою проблему, хотя вы правы в том, что способ обойти дублирование кода будет заключаться в использовании AOP. @DeclareMixin позволяет легко смешивать код с Java-классами. – user299703

Смежные вопросы