Наследование ORM

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

Или наследование ORM — это концепция «журавля в небе»?


person Otávio Décio    schedule 27.02.2009    source источник
comment
что вы подразумеваете под наследованием ORM?   -  person Mladen Prajdic    schedule 27.02.2009
comment
Возможность иметь классы сущностей, производные от других классов сущностей.   -  person Otávio Décio    schedule 27.02.2009


Ответы (4)


Мне очень нравится этот вопрос. Я некоторое время использовал инструменты ORM (Toplink, теперь eclipselink, Hibernate) и всегда видел ссылки на них в документах JPA, но мне это никогда не было нужно. По сути, моя философия заключается в том, что ORM существует только для того, чтобы вы не писали утомительный код для извлечения записей из базы данных. Это действительно огромная экономия времени и убережет вас от глупых ошибок. Конечно, вы можете делать с этим причудливые вещи, но почему бы не сохранить его для контроллера (если вы следуете MVC), а не вставлять его в модель?

person GBa    schedule 27.02.2009
comment
Итак, вы бы сказали, что традиционный подход с одним классом на таблицу работает в большинстве случаев? - person Otávio Décio; 27.02.2009
comment
В моем случае это то, что я всегда находил. Использование наследования просто сбивает с толку отображение IMO и является скорее игрушкой, чем чем-либо полезным. - person GBa; 27.02.2009

Я использовал наследование с Hibernate (и некоторые с Django) и очень сожалел об этом.

Принцип «композиция важнее наследования» особенно актуален для доменных классов. Хотя я согласен с тем, что есть несколько случаев, когда наследование имеет смысл на уровне модели, в большинстве случаев наследование даст вам очень статичную модель предметной области, где один объект не сможет измениться на другой класс.

Я также обнаружил, что большинству разработчиков не нравится концепция наследования на уровне базы данных, поэтому обслуживание усложняется.

И, наконец, есть некоторые технические проблемы, такие как прокси-серверы, созданные Hibernate, которые будут скрывать фактический класс объекта. Это заставляет «экземпляр» вести себя странно. Конечно, вы можете сказать, что «экземпляр» — это запах кода и, возможно, это еще один намек на то, что композиция, вероятно, является лучшим решением…

person Guillaume    schedule 27.02.2009
comment
Похоже, что прямой класс для таблицы (с композицией) - это способ перейти от того, что я здесь читаю. Спасибо за понимание. - person Otávio Décio; 27.02.2009
comment
не согласен. Если вы помните, что вы не можете изменить объект из одного класса в другой, это очень мощная техника, поскольку она позволяет вам применить ваши общие знания ООП к реляционной модели. - person Mauricio Scheffer; 27.02.2009
comment
Что касается проверки фактического типа за прокси, это ОЧЕНЬ вонючее... используйте посетителя или полиморфизм: hibernate. org/280.html - person Mauricio Scheffer; 27.02.2009
comment
Ну, композиция вместо наследования, конечно, тоже распространенное знание ООП, но иногда наследование более удобно (о нет, я слышу грядущую войну флеймов! ;-)) В любом случае, это еще один инструмент, который вы можете (или не можете) использовать. - person Mauricio Scheffer; 27.02.2009
comment
@mausch - Если бы вы использовали инструмент ORM, вы бы считали наследование обязательным или просто приятным? - person Otávio Décio; 27.02.2009
comment
Это, конечно, не обязательно, но очень приятно иметь. Он позволяет выполнять полиморфные запросы, см. пример: metaarchit.com/hibernate_tutorials/ - person Mauricio Scheffer; 27.02.2009
comment
Я согласен, что это приятно иметь, но вы должны быть осторожны, чтобы не злоупотреблять этим. - person Guillaume; 03.03.2009

Если вы имеете в виду наследование в классах предметной области, я постоянно использую его с NHibernate и/или Castle ActiveRecord, они поддерживают три стратегии сопоставления:

person Mauricio Scheffer    schedule 27.02.2009
comment
Спасибо, я проверю их. - person Otávio Décio; 27.02.2009
comment
@Mauricio Я работаю над проектом, в котором есть тип записи, который мы назовем Master. Существует около 17 типов основных записей, большинство из которых имеют схожие поля данных, но каждая из них может иметь одно или два уникальных поля. Люди до меня использовали наследование, чтобы создать класс сущностей Master с 17 подклассами сущностей. Сначала это казалось отличным, но после того, как я поработал с ним некоторое время, мне интересно, не могла ли одна таблица Master, которая допускала нулевые значения, быть лучше (например, сейчас в базе данных 17 разных таблиц, я не могу изменить один тип на другой) без труда). Я был бы очень признателен за ваши мысли. - person theblang; 31.05.2013
comment
@mattblang Привет, Мэтт, не путай наследование в классах предметной области со стратегией сопоставления. У вас может быть 17 подклассов, сопоставленных с отдельными таблицами или с одной таблицей, проверьте документы NHibernate для справки. Если вам нужно изменить один тип на другой, вы уже заметили, что наследование в целом и table-per-class в частности работает плохо. - person Mauricio Scheffer; 01.06.2013

Если вы пишете сложное программное обеспечение для бизнеса, оно вам необходимо.

Допустим, вы хотите иметь возможность продавать вещи отдельным лицам или организациям. В заказе на продажу покупателем будет тот или иной. Как это сделать без наследства?

С наследованием вы бы сделали что-то вроде этого:

@Entity
@Inheritance
public abstract class Party {

  @Id
  private Long id;

  ...
}

@Entity
public class Individual extends Party {
  ...
}

@Entity
public class Organization extends Party {
  ...
}

@Entity
public class SalesOrder {

  private Party buyer;

  ...
}

Затем вы можете сделать:

salesOrder.setBuyer(someOrganization) or salesOrder.setBuyer(someIndividual)

person Neil McGuigan    schedule 03.02.2016