Кто-нибудь действительно хотел и использовал поддержку наследования в инструментах ORM, и если да, то какой из них, по вашему мнению, обеспечивает наилучшую поддержку?
Или наследование ORM — это концепция «журавля в небе»?
Кто-нибудь действительно хотел и использовал поддержку наследования в инструментах ORM, и если да, то какой из них, по вашему мнению, обеспечивает наилучшую поддержку?
Или наследование ORM — это концепция «журавля в небе»?
Мне очень нравится этот вопрос. Я некоторое время использовал инструменты ORM (Toplink, теперь eclipselink, Hibernate) и всегда видел ссылки на них в документах JPA, но мне это никогда не было нужно. По сути, моя философия заключается в том, что ORM существует только для того, чтобы вы не писали утомительный код для извлечения записей из базы данных. Это действительно огромная экономия времени и убережет вас от глупых ошибок. Конечно, вы можете делать с этим причудливые вещи, но почему бы не сохранить его для контроллера (если вы следуете MVC), а не вставлять его в модель?
Я использовал наследование с Hibernate (и некоторые с Django) и очень сожалел об этом.
Принцип «композиция важнее наследования» особенно актуален для доменных классов. Хотя я согласен с тем, что есть несколько случаев, когда наследование имеет смысл на уровне модели, в большинстве случаев наследование даст вам очень статичную модель предметной области, где один объект не сможет измениться на другой класс.
Я также обнаружил, что большинству разработчиков не нравится концепция наследования на уровне базы данных, поэтому обслуживание усложняется.
И, наконец, есть некоторые технические проблемы, такие как прокси-серверы, созданные Hibernate, которые будут скрывать фактический класс объекта. Это заставляет «экземпляр» вести себя странно. Конечно, вы можете сказать, что «экземпляр» — это запах кода и, возможно, это еще один намек на то, что композиция, вероятно, является лучшим решением…
Если вы имеете в виду наследование в классах предметной области, я постоянно использую его с NHibernate и/или Castle ActiveRecord, они поддерживают три стратегии сопоставления:
Master. Существует около 17 типов основных записей, большинство из которых имеют схожие поля данных, но каждая из них может иметь одно или два уникальных поля. Люди до меня использовали наследование, чтобы создать класс сущностей Master с 17 подклассами сущностей. Сначала это казалось отличным, но после того, как я поработал с ним некоторое время, мне интересно, не могла ли одна таблица Master, которая допускала нулевые значения, быть лучше (например, сейчас в базе данных 17 разных таблиц, я не могу изменить один тип на другой) без труда). Я был бы очень признателен за ваши мысли.
- person theblang; 31.05.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)