gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:52:08 24 4
gpt4 key购买 nike

我正在设计一个解决方案,以比从数据库获取所有相关数据更简单且可能更有效的方式处理复杂结构(具有大量关系的用户相关内容)。我在用例中真正需要的唯一数据部分基本上包含在非关系“主”实体字段中。

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

我还尝试在关系字段上使用惰性启动(我一开始就猜想这在这里会很好用),但我无法让它按照我想要的方式与 Jackson 一起工作(只有 JSON 中的非惰性字段,如果不获取惰性相关数据 - 它无法序列化或触发另外几十个关系查询)。

我在一些教程中偶然发现的另一件事是从“OldMain”实体创建 DTO,以不触及惰性字段,但在我开始使用 @MappedSuperClass 方式时尚未尝试过。

@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
}
@Table(name = "X")
@Entity
public class Extended extends Extracted{
//all relational fields from OldMain, no data fields
}

此外,普遍的问题是 - 在处理仅使用较大实体的子集的需求时是否有任何好的实践?

最佳答案

JPA 实体没有义务映射数据库中相应表中的所有现有列。也就是说,给定一个包含列 col1、col2、col3 的表 my_entity,映射到该表的实体只能映射 col1 col2 并忽略 col3。话虽这么说,再加上您只需要非关系属性,您可以直接将您的 Extracted 类与您需要的属性一起使用,并忽略其他关系字段存在的事实。此外,如果所有关系字段都可以为空,那么您甚至可以保留 Extracted 类的新实例。 Jackson 只会(取消)编码 Extracted 类中声明的属性。

在其他情况下,我建议遵循您已经采用的方法并定义新的实体类,以使用所需的属性扩展您的 Extracted 类。我不明白“代码结构看起来很奇怪”,除了有一个没有比 Extracted 新属性的 Basic 类 - 你可以轻松地制作 Extracted 非抽象并直接使用它,并摆脱 Basic

关于java - 在 Hibernate 中将实体字段子集映射为单独的类的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56247513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com