Как избежать пустых дочерних таблиц при использовании InheritanceType.JOINED? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть один суперкласс JPA и десятки подклассов.Большинство из этих подклассов не добавляют определенные свойства.

При использовании InheritanceType.JOINED JPA предполагает использование подстали для каждого подкласса, что приводит к большому количеству устаревших таблиц базы данных, что усложняет администрирование базы данных и запросы.

Мой суперкласс в настоящее время выглядит следующим образом:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type")
public abstract class Employee {
    @Id public int id;
    public String firstName;
    public String lastName;
    public Date birthday;
}

Некоторые подклассы имеют определенные поля:

@Entity
public class ProjectManager extends Employee {
    public String project;
}

Однако большинство подклассов пусто:

@Entity
public class Director extends Employee {
}

@Entity
public class FacilityManager extends Employee {
}

Эти таблицы базы данных имеют смысл:

employee(id, first_name, last_name, birthday)
project_manager(id, project)

Как можно избежать этих устаревших таблиц?

director(id)
facility_manager(id)

Если я просто не создаю их, проверка JPA завершается неудачно:

Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
    ...
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [director]
    at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:67) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
    ...

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018
  1. Наличие подклассов без каких-либо полей, безусловно, является допустимой конструкцией, но за свою трехлетнюю карьеру я никогда не сталкивался с необходимостью такой конструкции, поэтому я готов поспорить, что любой ваш дизайнне очень хорошо продуман, или вы просто еще не обнаружили поля, которые вам понадобятся позже.

  2. Даже если мы считаем пустые подклассы допустимой конструкцией, вашаДополнительный запрос на исключение соответствующих таблиц не обязательно является разумной функцией для поддержки.Исключение этих таблиц, вероятно, потребовало бы нескольких дополнительных if операторов здесь и там в исходном коде hibernate, но этот тип использования является настолько редким случаем, что поддерживать его, скорее всего, не стоит.Не стоит обременять исходный код даже малейшим битом, и не стоит писать необходимые тесты для его поддержки.

  3. Даже если отбрасывать таблицы подклассов на пустые подклассыпри поддержке Hibernate это может привести к потере определенных функций.Например, может случиться так, что без таких таблиц Hibernate не сможет отвечать на запросы, такие как «найди меня всех директоров» или «найди меня всех руководителей объектов».Опять же, вместо таблицы подклассов для hibernate все еще может быть возможность отвечать на запросы такого рода путем запроса таблицы базового класса, но это не будет нормальным режимом работы (это будет более дорого), так что это будетдля поддержки этого чрезвычайно редкого запроса требуется кодирование особого случая внутри hibernate.Опять же, это неразумно.

  4. В вопросе, который вы упоминаете "Если я просто не создаю их, ..." - вы уверены, что используете Hibernate правильно?Вам не нужно создавать их, вы должны быть в состоянии сделать это за вас.Как правило, вам не нужно управлять базой данных (и, следовательно, все эти пустые таблицы не должны быть для вас проблемой), поскольку весь смысл использования hibernate заключается в том, что нам не нужно иметь дело с базой данных.Когда я использую hibernate, я редко смотрю на таблицы, я часто даже не знаю, какие таблицы есть, hibernate позволяет мне роскошь просто не заботиться, по большей части.Время от времени рекомендуется проверять состояние базы данных, чтобы избежать неожиданностей, но это далеко от управления базой данных и обременения такими вещами, как некоторые ненужные таблицы.

0 голосов
/ 24 сентября 2018

Решение есть, но только при использовании EclipseLink.Hibernate не поддерживает это:

Смешанное наследование

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

Пример:Использование JOINED со смешанным наследованием

@Entity
// This subclass does not define its own table, but shares its parent's ACCOUNT table.
@Table(name="ACCOUNT")
@DiscriminatorValue("3")
public class StandardAccount extends Account {
   ...
}

Источник: https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Inheritance#Mixed_Inheritance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...