2009-07-01 4 views
0

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

У меня есть 3 типа сущностей:

  • Элемента
  • Категория
  • PropertyType

Элемента и Категория и PropertyType все похожи; они оба имеют название, описание, дата создания и т.д., но каждый из них имеет дополнительные отдельные функции:

  • элемент имеет конкретное местоположение (URL)
  • Категория содержит наборы Предмет и/или категории, в связь между многими и многими из категории и элемента, а также список смежности от родительской категории к дочерней категории.
  • PropertyType является одним из ключевых метаданных для использования в таблице свойств полей ключ/значение, связанное с элементами, категории или других PropertyTypes

Сейчас я Пункт и категории определяются в отдельных таблицах, но мне интересно, было бы разумно создать абстрактный класс сущности узла, для которого Элемент и Категория являются подклассами. PropertyType достаточно разный, что он, вероятно, должен жить в своей собственной таблице. (У меня есть только 3 записи для Property, где PropertyType применяется к другому PropertyType и может избавиться от них, если это упростит ситуацию, так что PropertyType всегда применяется к узлу).

В настоящее время моя таблица свойств содержит поля для PropertyTypeId, ID (идентификатор элемента, категории или свойства), id_context (дискриминатор для предыдущего поля: 0 = элемент, 1 = категория, 2 = PropertyType) и значение (произвольная строка).

Конкретные вопросы:

  1. Если я хочу сохранить свою существующую структуру таблицы (например пункт и категории имеют различные таблицы), как я говорю, Hibernate использовать id_context дискриминатор для определения типов недвижимости? Должен ли я создавать Item/Category/PropertyType подклассы общего предка, чтобы при получении объектов свойств, связанных с данным PropertyType, он мог возвращать списки, содержащие элемент или категорию?

  2. Должен ли я использовать Hibernate вообще? Я знаю, как заставить SQL-запросы делать то, что я хочу, у меня просто возникают проблемы с тем, как обернуть Hibernate вокруг него.

  3. Что мне нужно сделать, чтобы подтолкнуть Hibernate к выполнению запросов, которые я хочу? например если я просто хочу вернуть записи свойств, где PropertyType - 258, которые применяются к объектам категории (id_context = 2), я знаю, как это сделать в SQL (SELECT * FROM Property WHERE PropertyType = 258 AND id_context = 2), но я не знаю как это сделать в Hibernate.

+0

ли вы планируете использовать файлы сопоставления XML Hibernate или аннотации? –

+0

предпочтет аннотации, но рассмотрит XML. –

ответ

1

То, что вы хотите с помощью ссылки внешнего ключа и столбца дискриминатора на стороне внешнего ключа, в настоящее время не поддерживается спящим режимом.Истинный Hibernate-aholic, вероятно, будет утверждать, что это не звуковая реляционная модель, потому что вы не можете определить ограничение внешнего ключа.

Чтобы моделировать это с помощью Hibernate, вам необходимо объединить все три типа сущностей или иметь два отдельных столбца, один из которых ссылается на элемент/категорию (который будет унифицирован) и один ссылается на PropertyType: по существу разбивая класс PropertyType в два дизъюнктных подкласса.

Вам в основном придется изменить всю вашу настройку БД, чтобы она соответствовала спящим режимам.

Есть причины переехать в спящий режим, а затем «прозрачный» ОРМ. Я думаю, вы должны искать в другом месте своего приложения, чтобы определить, подходит ли Hibernate для него: с какими проблемами вы сталкиваетесь? Что вы хотите, чтобы Hibernate решался? Есть множество функций, которые Hibernate предусматривает, что может быть полезным: - Ленивая Загрузка - Поздний пишут (только запись в БД, когда TX совершил) - 1-я и кэширование второго уровня - ...

Приветствия

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