我正在设计一种解决方案,该解决方案以比从数据库中获取所有相关数据更简单,更有效的方式来处理复杂结构(与用户相关的东西,具有很多关系)。在用例中,我真正需要的唯一数据基本上是与非关系型“主要”实体字段一起包含的。到目前为止,我将基本字段从“主”类(让它称为OldMain类)提取到另一个类(让我们将其称为抽象类Extracted),使用@MappedSuperclass并创建了2个扩展它的类-Basic(空类为提取后会提供所有我需要的数据,并映射到表“ X”)和扩展(也映射到表“ X”,但具有所有其他关系)。它基本上可以工作,但是代码结构看起来很奇怪,这让我开始思考这是否是解决此类问题的正确方法。我还尝试过在关系字段上进行延迟启动(我猜想一开始它会在这里很好地发挥作用),但是我无法使其与杰克逊一起工作(只有JSON中的非延迟字段,而没有获取延迟)相关数据-无法序列化或触发另外几十个相关查询)。在某些教程中,我偶然发现的另一件事是使'OldMain'实体的DTO不再接触惰性字段,但是在我以@MappedSuperClass方式开始时还没有尝试过。@Table(name = "X")@MappedSuperclasspublic abstract class Extracted{ //all the non-relational fields from OldMain @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private String surname; private String userName; private String email;}@Table(name = "X")@Entitypublic class Basic extends Extracted{ //empty}@Table(name = "X")@Entitypublic class Extended extends Extracted{ //all relational fields from OldMain, no data fields}另外,一般的问题是-在仅使用较大实体的子集时是否有任何良好做法? 最佳答案 JPA实体没有义务映射数据库中相应表中的所有现有列。也就是说,给定具有列my_entity的表col1, col2, col3,映射到该表的实体只能映射col1和col2而忽略col3。话虽这么说,再加上只需要非关系属性的事实,您可以直接将Extracted类与所需的属性一起使用,而忽略其他关系字段存在的事实。此外,如果所有关系字段都可以为空,那么您甚至可以持久化Extracted类的新实例。而且Jackson只会封送Extracted类中声明的属性。在其他情况下,我建议遵循已经存在的方法,并定义新的Entity类,以使用必需的属性扩展Extracted类。我没有看到“代码结构看起来很奇怪”,除了有一个Basic类,没有比Extracted还要新的属性-您可以轻松地将Extracted设为非抽象并直接使用,并摆脱。 07-27 13:50