在Hibernate中将实体字段的子集映射为单独的类的有效方法

时间:2019-05-21 23:29:53

标签: java hibernate jpa

我正在设计一种解决方案,该解决方案以比从数据库中获取所有相关数据更简单,更有效的方式来处理复杂结构(与用户相关的东西具有很多关系)。在用例中,我真正需要的唯一数据基本上是与非关系性“主要”实体字段一起包含的。

就目前而言,我将“ main”类(让它称为OldMain类)中的基本字段提取到另一个类(我们将其称为“提取的抽象类”)中,使用@MappedSuperclass并创建了2个扩展它的类-Basic(即提取的空类为它提供了我需要的所有数据,并映射到表“ X”)和扩展(也映射到表“ X”,但具有所有其他关系)。它基本上可以工作,但是代码结构看起来很奇怪,这让我开始思考这是否是解决此类问题的正确方法。

我也尝试过在关系字段上进行延迟启动(我猜一开始它会在这里很好地起作用),但是我无法像我想要的那样让它与Jackson一起使用(仅JSON中的非延迟字段,而不获取延迟的相关数据-无法序列化或触发另外几十个关系查询。

我在某个教程中偶然发现的另一件事是使'OldMain'实体的DTO不能接触到惰性字段,但是在我以@MappedSuperClass方式开始时还没有尝试过。

=prevsheet(A1)
@Table(name = "X")
@MappedSuperclass
public 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")
@Entity
public class Basic extends Extracted{
    //empty
}

另外,普遍的问题是-处理仅使用较大实体的子集时是否有良好的做法?

1 个答案:

答案 0 :(得分:1)

JPA实体没有义务映射数据库中相应表中的所有现有列。也就是说,给定具有列x1 = [0.82 0.82 0.82 0.82 0.82 0.82 0.83 0.83 0.83 0.83 0.83 0.83 0.83] y1 = [0.93 0.93 0.93 0.93 0.94 0.94 0.94 0.94 0.94 0.94 0.94 0.94 0.94] f = interp1d(x1, y1, kind='cubic') #this gives an error: Expect x to be a 1-D sorted array_like. #another thing I tried xnew = np.linspace(x1.min(),x1.max(),300) splined = spline(x1,y1,xnew) #this gives an error: Matrix is singular 的表my_entity,映射到该表的实体只能映射col1, col2, col3col1而忽略col2。话虽这么说,再加上只需要非关系属性,您可以直接将col3类与所需的属性一起使用,而忽略其他关系字段存在的事实。此外,如果所有关系字段都可以为空,那么您甚至可以持久保存Extracted类的新实例。杰克逊只会(/)解组Extracted类中声明的属性。

在其他情况下,我建议遵循已经存在的方法,并定义新的Entity类,以使用必需的属性扩展Extracted类。除了具有Extracted没有新属性的Basic类之外,我看不到“代码结构看起来很奇怪”-您可以轻松地使Extracted为非抽象并直接使用它,并摆脱Extracted