我正在设计一种解决方案,该解决方案以比从数据库中获取所有相关数据更简单,更有效的方式来处理复杂结构(与用户相关的东西具有很多关系)。在用例中,我真正需要的唯一数据基本上是与非关系性“主要”实体字段一起包含的。
就目前而言,我将“ 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
}
另外,普遍的问题是-处理仅使用较大实体的子集时是否有良好的做法?
答案 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, col3
和col1
而忽略col2
。话虽这么说,再加上只需要非关系属性,您可以直接将col3
类与所需的属性一起使用,而忽略其他关系字段存在的事实。此外,如果所有关系字段都可以为空,那么您甚至可以持久保存Extracted
类的新实例。杰克逊只会(/)解组Extracted
类中声明的属性。
在其他情况下,我建议遵循已经存在的方法,并定义新的Entity类,以使用必需的属性扩展Extracted
类。除了具有Extracted
没有新属性的Basic
类之外,我看不到“代码结构看起来很奇怪”-您可以轻松地使Extracted
为非抽象并直接使用它,并摆脱Extracted
。