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

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

Или ORM Inheritance - концепция "пирог в небе"?

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 4

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

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

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

@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)