JPA / Hibernate: подтип против стратегии «шаблон» - PullRequest
1 голос
/ 06 сентября 2011

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

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

@Entity
@Table
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class SuperEntity {
  // Several fields and getters and setters
  ...
  // Abstract method declarations for business logic
  ...
}

@Entity
@DiscriminatorValue("some value")
public class SomeSubtype extends SuperEntity {
  // Implementations of abstract methods
  ...
}

Является ли это извращением концепции столбца дискриминатора в JPA / Hibernate?

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

1 Ответ

1 голос
/ 06 сентября 2011

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

JPA и hibernate в стороне, каждая книга о дизайне ОО, которую я когда-либо читал, начинается с "предпочтение композиции над наследованием" для обмена поведением.

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

...