当前位置: 首页 > 面试题库 >

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

壤驷俊逸
2023-03-14
问题内容

我正在使用Spring Boot开发一个相对较大的项目,总的来说,我对它很满意,但是我遇到了一些问题,这些问题在我看来应该不是问题。

  1. 首先,一对一关系。令人沮丧的是,它无法正常运行(至少在我看来)。

我有两个实体,User并且UserProfile,例如。他们之间存在一对一的关系,但是大多数时候我只需要User数据,但是数据就可以获取(无论我尝试什么,天哪,我都尝试过在Google的5页每篇文章中的世界建议)。

因此,我的第一个问题是,是否有一种方法可以在JPA和Spring中懒洋洋地获取一对一关系?(因为大多数职位超过2-3年)。

  1. 我遇到的另一个问题是要以“动态”方式构建JSON响应。我使用Rails做了一些事情,对此感到非常满意,JBuilder甚至to_json使我能够根据控制器和当前的需求构建json响应。

在春季,我看到了以下解决方案:

* `Jackson @JsonView` (这不能完全解决我的问题,因为响应不是静态的,并且不能将属性分配给多个视图(据我了解的概念));
* 设置为我不想在响应中使用的空属性(使用此属性,但是我太丑陋,看起来像一个错误的演练);
* 或`HashMap`像`.json.jbuilder`在Rails上构建一样进行构建(但是这有时会影响我的性能,因为有时它`for`与构建json的关系很多,而且看起来像是一个丑陋的演练)。

我正在寻找某人的某个方向,有一天可能会遇到其中一个问题,因为这使我无法解决这个问题,这使我丧命,这在我看来不应该那么难。

编辑1

已经尝试添加optional = false@OneToOne注释来解决的OneToOne关系的渴望负荷@snovelli建议。例:

@OneToOne(optional=false, fetch = FetchType.LAZY)
public UserProfile getUserProfile(){ ... }

问题答案:

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

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

解决方案:

  1. 字节码检测。虽然没有被广泛采用。
  2. 使用一对多,并以处理空列表null,否则使用list.get(0)。您当然可以将其封装在实体类中(getter返回列表或的唯一元素null)。缺点是您必须将其视为JPQL查询中的集合
  3. 使用@PrimaryKeyJoinColumn代替外键。如果关联不是可选的(optional = false),则JPA提供程序会知道存在一个具有相同PK的关联子项,因此它将仅将父项的PK作为子项的ID存储在代理中。显然,您不能为两个实体使用两个独立的ID生成器,否则PK可能会有所不同。如果满足您的要求,这是最好的方法。
  4. 还要在父表中添加外键(在数据库中也使关系成为双向的)。缺点是您现在基本上必须维护两个独立的关联。同样,更新两个表而不是更新一个表也要付出性能成本(并且外键必须为空)。
  5. 将父实体映射到一个数据库视图,该数据库视图将父表与子表连接在一起,并包含所有父列以及子表的ID:
        @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "<child id in the view>", insertable = false, updatable = false)
    private Child child;


 类似资料:
  • 我正在使用Spring Boot开发一个相对较大的项目,总的来说我对此相当满意,但我有一些问题,在我看来应该不是问题。 > 首先是一对一的关系。令人沮丧的是,它没有像它应该的那样工作(至少在我的心目中是这样)。 我有两个实体,例如和。他们有一对一的关系,但大多数时候我只需要数据,但它获取(无论我尝试什么,和哦,男孩,我尝试了世界建议在每个帖子上为谷歌的5页)。 所以这是我的第一个问题,有没有一种方

  • 在某些情况下,我的广播接收器是不需要的,所以需要检查接收器是否为空,但有些如何这个对象不为空,即使不使用它和造成崩溃。

  • 我写了以下内容: 解决4clojure.com的问题#118:http://www.4clojure.com/problem/118 当我询问时,不出所料,我会得到一个clojure.lang.lazyseq,但我不知道这与简单地删除lazy-seq“包装”有什么区别。 当然,现在如果删除lazy-seq,我会得到一个stackoverflow,为什么要执行这个: 否则(也就是说:如果我让lazy

  • 问题内容: 我的问题很简单,如何使这段代码变得懒惰: 上面的代码可以计算组合,但是可以在内存中创建整个数组数组。我需要让它返回类似的东西,除了Swift类型系统不允许我做一些通用的事情。 有什么想法如何实现这一目标并保持功能风格吗? 附注:我确实想过用生成器解决这个问题并跟踪索引的另一种方法,但是我不想跟踪任何状态,我想要一个纯函数式(如FP中)的解决方案。Haskell默认情况下会这样做,顺便说

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 问题内容: 自1.3.0-beta.10版本以来,AngularJS具有一项新功能:“懒惰的一次性绑定”。 可以在简单表达式的前面加上,告诉angular在首次评估表达式后停止观看。给出的常见示例如下所示: 类似以下表达式的语法是否类似? 问题答案: 是。您可以在每个表达式前添加,甚至可以在或中添加前缀: 实际上,代码只是检查表达式中的前两个字符是为了激活一次性绑定(然后将其删除,因此甚至不需要括