【问题标题】:Single table inheritance view and application solution for Spring Boot and ThymeleafSpring Boot 和 Thymeleaf 的单表继承视图及应用解决方案
【发布时间】:2021-01-11 23:46:15
【问题描述】:

我决定在应用程序的视图部分使用单表继承,这会导致拥有多个类并且我无法通过父对象访问子对象的字段 .到目前为止,我还没有找到一个很好的解决方案如何在 Thymeleaf 中处理它。这是什么意思?
在我拆分我的类以使用单表继承之前,我可以轻松地传递 1 个对象类,其中包含创建或显示对象所需的所有信息,但它有太多字段将为空。使用多个类,thymeleaf 并不允许您将对象转换为不同的类型(据我了解,在应用程序的视图部分中这样做不是一个好习惯)。那么处理这个问题的最佳方法是什么? 我可以想出这样的想法:

  1. 创建一个包含所有类的字段并将对象转换为此类的 DTO,这在创建视图中会很棒(发布 DTO,然后从中创建一个对象并添加到数据库中)。但是,如果我使用这种方法来显示信息,那么这将意味着将每个对象转换为 DTO 类,这在我看来有点错过了单表继承的意义。我觉得这太像回到没有继承的状态了。
  2. 传递多个对象或一个父对象 + 一个不同的对象,该对象将包含父类不包含的其余信息。这似乎也有点奇怪。
  3. 为每个子类附加字段向父类添加一个方法,并在子类中覆盖它们以返回实际值,而父类将返回 null。不确定这是否能解决从视图创建对象的问题。

让我们假设这个示例包含三个简单的类,其中 Person 是父类,Client 和 Employee 是它的子类。为简单起见,我将跳过 getter、setter 和构造函数。

持有共享字段的人主类

@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 类使用附加字段 favouriteProduct

扩展人员
@Entity
@DiscriminatorValue(value= "CLIENT")
public class Client extends Person {

String favouriteProduct;
}

Employee 类,通过附加字段薪水和职位扩展人员。

@Entity
@DiscriminatorValue(value= "EMPLOYEE")
public class Employee extends Person {

String position;
int salary;
}

鉴于这种简单的结构,我想通过 POST 请求通过单个表单创建 Employee 和 Client 对象,并将它们一起显示在不同的视图中,并且它们的字段对于每个子类都是唯一的。问题是我需要将一个包含所有字段的对象传递给视图以使其实际工作,这又回到了我提出的问题和解决方案。有没有正确的方法或最佳实践来处理这个问题?我认为 DTO 应该从完整对象缩减为具有较少字段的对象。

结论:如果答案不是那么简单,那么在这种情况下,单表继承的真正用途是什么?为什么回到 1 表实现不是一个好主意?我已经知道多态查询,这是一个很好的奖励,但到目前为止我还不能真正处理我上面解释的问题。提前致谢!

【问题讨论】:

标签: java spring-boot inheritance thymeleaf single-table-inheritance


【解决方案1】:

我不了解 Thymeleaf(对不起!),但我确实了解一点面向对象编程。抛开框架,从纯粹的 OO 角度讨论,父类对它们的子类(继承者)一无所知。只有相反的情况是正确的,那就是如果您使用适当的访问修饰符。话虽如此,我相信你不能做你想做的事,除非有一些丑陋的框架黑魔法在后台运行哈哈。

【讨论】:

  • 我觉得数据库的最终结果几乎相同,除了在应用程序端我有 1 个类而不是 3 个,而且这个类代表的比它应该的多,这有点麻烦。但我不确定是否值得沿着这条路线走并实现单表继承,因为它会使所有对象传递和转换非常容易出错。也许具有 spring-boot 和 thymeleaf 特定知识的人有一些技巧。
猜你喜欢
  • 2017-06-11
  • 2012-08-14
  • 2017-12-07
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2019-04-09
相关资源
最近更新 更多