Я сопоставляю устаревшую базу данных, одна таблица которой естественно сопоставляется с иерархией наследования с использованием сопоставления SINGLE_TABLE
с использованием столбца дискриминатора. Проблема в том, что существует огромное количество значений дискриминатора! (Кроме того, иногда добавляются новые, и приложение автоматически выбирает их в полиморфных запросах). С точки зрения моего приложения, я хотел бы рассматривать подавляющее большинство этих разных типов одинаково (т. Е. Просто сопоставить их с базовым классом в иерархии наследования). Однако, для небольшого числа, я хотел бы сопоставить определенный подкласс. Проблема в том, что JPA, по-видимому, требует, чтобы я предоставлял один конкретный @DiscriminatorValue
в базовом классе (иначе он генерирует значение по умолчанию).JPA (Hibernate) Значение SINLE_TABLE наследования по всем признакам?
Чтобы быть конкретным:
@Entity
@Table("products")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "product_type")
@DiscriminatorValue(*anything not specified elsewhere!*)
public class Product {
...
public double calculateMarkup() { ... default impl ... }
}
@Entity
@DiscriminatorValue("ProductA")
public class ProductA extends Product {
...
@Override public double calculateMarkup() { ... specific impl ... }
}
Есть ли способ, чтобы отобразить это элегантно в JPA (или Hibernate 3,3-определенными расширениями)? Единственное решение, с которым я могу прийти, это отказаться от наследования и отобразить столбец как нормальное поле, которое внутренне делает это значение для особых случаев, но это кажется неестественным и немного грязным.
«за горсть, я хотел бы карту к определенному подклассу» - как они отличаются от основания класс? Уточняют ли члены-члены базовый класс? –
Без полей, просто по-разному. –