当前位置: 首页 > 知识库问答 >
问题:

懒散的一对一Spring JPA和构建“动态”JSON

罗鸿畴
2023-03-14

我正在使用Spring Boot开发一个相对较大的项目,总的来说我对此相当满意,但我有一些问题,在我看来应该不是问题。

>

  • 首先是一对一的关系。令人沮丧的是,它没有像它应该的那样工作(至少在我的心目中是这样)。

    我有两个实体,例如useruserprofile。他们有一对一的关系,但大多数时候我只需要用户数据,但它获取(无论我尝试什么,和哦,男孩,我尝试了世界建议在每个帖子上为谷歌的5页)。

    所以这是我的第一个问题,有没有一种方法能够在JPA和Spring中懒取一对一的关系?(因为大部分的帖子都是2-3年以上的)。

    我遇到的另一个问题是以“动态”的方式构建JSON响应。我使用Rails做了一些工作,并且非常喜欢jbuilder甚至to_json,它使我能够根据控制器和当前的需要构建json响应。

    在Spring我看到了以下解决方案:

    • jackson@jsonview(这并不能完全解决我的问题,因为响应不是静态的,而且一个属性不能分配给多个视图(就我理解的概念而言));
    • 将响应中不想要的属性设置为空(使用该属性,但太难看了,看起来像是一个错误的演练);
    • 或构建HashMap(就像我在Rails上构建.json.jbuilder一样)(但这会损害我的性能,因为有时它有关系,所以需要大量的来构建json,而且这看起来是一个很难看的演练)。

    我想从某一天可能遇到过这样一个问题的人那里寻找一些方向,因为不能解决在我看来不应该这么难的问题让我很痛苦。

    编辑%1

    已尝试在@OneToOne批注上添加optional=false以解决@snovelli建议的OneToOne关系的急切加载问题。示例:

    @OneToOne(optional=false, fetch = FetchType.LAZY)
    public UserProfile getUserProfile(){ ... }
    
  • 共有1个答案

    徐涵亮
    2023-03-14

    如果联接列不在一对一关联中的父级映射到的表中,则该关联不能是惰性的。原因是JPA提供程序无法确定是否创建代理,以便在以后访问时加载对象,或者保留null值。

    即使关联不是可选的,JPA提供程序也必须确定关联实体实例的id,以将其存储在代理中。因此,它无论如何都必须转到相关联的表。

    解决方案:

    >

  • 字节码检测。但没有被广泛采用。
  • 使用一对多并将空列表处理为null,否则使用list.get(0)。当然,您可以将其封装在entity类中(getter返回列表的唯一元素或null)。缺点是必须在JPQL查询中将其视为集合。
  • 使用@PrimaryKeyJoinColumn而不是外键。如果关联不是可选的(optional=false),那么JPA提供程序知道有一个关联的子级具有相同的PK,因此它将只是将父级的PK作为子级的id存储在代理中。显然,您不能为这两个实体都使用两个独立的id生成器,否则PK可能会不同。如果符合您的要求,这是最好的方法。
  • 还要在父表中添加外键(使数据库中的关系也是双向的)。缺点是,你现在基本上有两个独立的协会,你必须维持。此外,更新两个表而不是一个表也会带来性能代价(外键必须为空)。
  • 将父实体映射到数据库视图,该数据库视图将父表与子表联接,并包含所有父列和子表的id:

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "<child id in the view>", insertable = false, updatable = false)
    private Child child;

  •  类似资料:
    • 问题内容: 我正在使用Spring Boot开发一个相对较大的项目,总的来说,我对它很满意,但是我遇到了一些问题,这些问题在我看来应该不是问题。 首先,一对一关系。令人沮丧的是,它无法正常运行(至少在我看来)。 我有两个实体,并且,例如。他们之间存在一对一的关系,但是大多数时候我只需要数据,但是数据就可以获取(无论我尝试什么,天哪,我都尝试过在Google的5页每篇文章中的世界建议)。 因此,我的

    • 我想以编程方式更改当用户滚动下面列表中的每个“查看更多”项目时选择的选项卡。我如何才能最好地完成这项工作?

    • 问题内容: 有没有办法复制通用结构(即属性名称未知的结构)并跳过单个已知属性? 这是我所知道的: 我函数的参数-我将称为参数-类型。 是一个结构。 具有已知的性质。 具有0到6左右的其他属性,这些属性都不是先验的。 一旦删除该属性,那么“剩余”就是30种可能的结构类型之一。 所以我想剥离出来(或更精确地进行复制,它省略),所以生成的代码的各个位,尝试了结构迫使其可能的类型之一就能成功。 我已经找到

    • 在中,我正在填充和。现在,我需要定义一个新的路由,它使用来自上传队列的消息,并复制一个本地文件夹(基于在上一个路由中生成的Id),并将其上传到目标文件夹,该文件夹是一个ftp服务器(这也在上一个路由中填充) 那么,如何设计一条新的路线,其中从和到终点都是动态的,如下所示?

    • 问题内容: 我是Python的新手,并且正在使用JSON数据。我想通过向现有JSON对象添加一些键值来动态构建JSON对象。 我尝试了以下方法,但得到了: 问题答案: 您在将对象编码为JSON字符串 之前先 对其进行构建: JSON是 序列化 格式,文本数据 表示 结构。它本身不是那个结构。

    • 我的应用程序在域级值对象之间使用了大量OneToMore和OneToOne引用,其中大多数是实体,要么是超类,要么是某物的子类。我想为我的应用程序提供一种一致(但简单)的方法来保存这些实例,实际的方法保存()就是这样 当前的问题是如何正确地实例化这些对象,以及在cassadeType中选择哪种策略,我想在保存带有其他实体引用的对象时保存嵌套对象,它现在可以工作,但只是第一次,之后我得到了一个,因为