Я решил использовать наследование одной таблицы, что приводит к созданию нескольких классов и я не могу получить доступ к дочерним полям через родительский объект в части представления приложения. Пока я не нашел хорошего решения, как с этим справиться в Thymeleaf. Что это значит?
До того, как я разделил свои классы для использования наследования одной таблицы, я мог легко передать 1 объектный класс, содержащий всю информацию, необходимую для создания или отображения объекта, но в нем было слишком много полей, которые были бы нулевыми. С несколькими классами тимелеаф на самом деле не позволяет вам приводить объекты к другому типу (и, насколько я понимаю, было бы не рекомендуется делать это в части просмотра приложения). Итак, каков на самом деле лучший способ справиться с этой проблемой? Я могу придумать такие идеи, как:
- Создайте DTO, который содержит поля из всех классов и преобразуйте объекты в этот класс, было бы здорово в режиме создания (POSTing DTO, а затем создание объекта из него и добавление в базу данных). Но если бы я использовал этот метод для отображения информации, это означало бы приведение каждого из объектов к классу DTO, что, на мой взгляд, упускает момент наследования одной таблицы. Я чувствую, что это слишком похоже на возвращение к полному отсутствию наследства.
- Передача нескольких объектов или родительского объекта + другого объекта, который будет содержать остальную информацию, которой нет в родительском классе. Это тоже выглядит как-то странно.
- Добавление одного метода в родительский класс для каждого дополнительного поля подкласса и перезапись их в подклассах, чтобы возвращать фактические значения, в то время как родительский возвращал бы значение null. Не уверен, что это решит проблему создания объектов из представления.
Давайте представим этот пример с тремя простыми классами, где Person является родительским классом, а Client и Employee являются его дочерними элементами. Я пропущу геттеры, сеттеры и конструкторы для простоты.
Основной класс Person, содержащий общие поля
@Entity
@Inheritance
@DiscriminatorColumn(name = "person_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
int personId;
int age;
String name;
}
Класс Client, расширяющий person дополнительным полем favouriteProduct
@Entity
@DiscriminatorValue(value= "CLIENT")
public class Client extends Person {
String favouriteProduct;
}
Класс Employer, расширяющий person дополнительными полями оклада и должности.
@Entity
@DiscriminatorValue(value= "EMPLOYEE")
public class Employee extends Person {
String position;
int salary;
}
Учитывая эту простую структуру, я хотел бы создать объекты Employee и Client через одну форму с помощью запроса POST, а также отобразить их вместе в другом представлении с их полями, уникальными для каждого подкласса. Проблема в том, что мне нужно передать объект, который содержит все поля, в представление, чтобы заставить его работать, что возвращает к проблеме и решениям, которые я придумал. Есть ли правильный способ или лучшая практика, как справиться с этим? Я думал, что DTO должны скорее уменьшаться от полных объектов до объектов с меньшим количеством полей.
Вывод: если ответ на самом деле не так прост, то в чем на самом деле польза от наследования одной таблицы в этом случае и почему не стоит просто вернуться к реализации с одной таблицей? Я уже знаю о полиморфных запросах, и это приятный бонус, но пока я не могу разобраться с проблемой, описанной выше. Заранее спасибо!