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

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

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

Ответов (4)

Решение

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

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

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

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

@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) или salesOrder.setBuyer(someIndividual)

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

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

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

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

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