Что такое хорошая стратегия наследования с Hibernate и JPA? - PullRequest
5 голосов
/ 01 августа 2010

У меня такая ситуация:

У меня есть субъект, Person, который содержит все личные данные человека, такие как дата рождения, почтовый адрес, муниципалитет и т. Д. И у меня есть объект ClubMember, который описывает члена клуба и содержит поле, такое как: дата регистрации, тип участника, кредит, ecc ecc

Итак, ClubMember - это Person, и я считаю правильным описать это наследованием: ClubMember extends Person, но какой тип стратегии?

Я бы получил две таблицы в базе данных, Person и ClubMember, с ClubMember, которые содержат id_person как отношение @OneToOne, но сохраняют наследование между сущностями; это возможно (и правильно)?

JOINED - это стратегия, ближайшая к моей цели, но я теряю поле ID таблицы ClubMember, фактически ID становится ID таблицы Person ...

Ответы [ 3 ]

5 голосов
/ 01 августа 2010

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

вместо

public class A {}

public class B extends A {}

, вы можете использовать

public class B {

    private A a;

}

Или вы можете использовать MapedSuperClass Toсопоставьте все свои наследуемые свойства без использования любой стратегии наследования Hibernate / JPA.См. здесь

При использовании аннотаций JPA / Hibernate по умолчанию Hibernate всегда выбирает все подклассы.Если у вас одиночная иерархия , предпочтите использовать стратегию наследования одной таблицы.Объединенная стратегия лучше разрабатывается, когда у вас сложная иерархия , но она страдает из-за проблем с производительностью при запросах для любого объекта.

1 голос
/ 01 августа 2010

РЕДАКТИРОВАТЬ: предполагается, что ответ ниже NHibernate, заранее извиняюсь, если это не относится к Hibernate

Это не всегда тривиально, даже если его можно реализовать тривиально (см. Ниже), иследует тщательно рассмотреть.По моему опыту, лучше придерживаться старой доброй агрегации или даже просто полей, где каждый член клуба имеет личность, а не личность.Это может не совсем чувствовать правильно, но оно легче работает с вашими конфигурациями, операциями CRUD и вашими абстрактными классами DAO.Инструменты автоматического сопоставления часто не поддерживают создание подклассов "из коробки".

Кроме того, люди, работающие как с вашей базой данных, так и с DAL, будут иметь представление об этом сопоставлении (т. Е. Person как один-к-одному).- одно сопоставление с ClubMember, добавьте ненулевое значение к свойству Person, и у вас также есть ограничение), поскольку оно больше похоже на базу данных.Вы можете, конечно, утверждать, что вся идея ORM состоит в том, чтобы устранить это сходство;).

Если вы хотите экспериментировать на этом пути или хотите посмотреть, как это делается, и применить его к вашей ситуации, У Айенде есть хороший блог на тему NHibernate и наследования .Это немного базово, но вы поймете идею.Если вы используете Fluent NHibernate, вам станет немного легче, см. этот краткий учебник .

0 голосов
/ 01 августа 2010

Я бы заставил ClubMemeber расширить Person, как вы предложили, и использовал бы таблицу для каждой стратегии сопоставления иерархии классов.

http://docs.jboss.org/hibernate/stable/core/reference/en/html/inheritance.html#inheritance-tableperclass

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...