【问题标题】:JPA Repository Join - Continuous Loop of data when retrieving data from DBJPA Repository Join - 从数据库中检索数据时数据的连续循环
【发布时间】:2020-09-23 14:47:19
【问题描述】:

我有两个存储库 - 用户和地址。

用户与地址具有一对一的关系,并且它们通过 ID 链接。请参见下面的代码 sn-ps。当我使用 JPA 存储库提取数据时,我基本上得到了一个恒定的数据循环。

EG:

<Data>
 <User>
   <id>1</id>
   <name>Mary</name>
   <dob>21/01/1990</dob>
   <Address> 
      <id>1<id>
      <address>123 Main Street</address>
       <User>
         <id>1</id>
          <name>Mary</name>
          <dob>21/01/1990</dob>
        <Address> 
          <id>1<id>
          <address>123 Main Street</address>
         <User>
            ....

诸如此类导致我的查询需要大量时间才能运行。有没有办法阻止用户对象在地址对象中返回?任何帮助将不胜感激。

@Entity
@Data
@Table(name = "ADDRESS")
 public class Address{

@Id
@Column()
private String id;

@Column()
private String address;

@OneToOne (fetch = FetchType.LAZY)
@JoinColumn(name = "id")
private User user;

}

@Entity
@Data
@Table(name = "User")
 public class User{

@Id
@Column()
private String id;

@Column()
private String name;

@Column()
private String dob;

@OneToOne ()
@JoinColumn(name = "id")
private Address address;

}

【问题讨论】:

  • 你的循环真的是来自 JPA 加载,还是来自模型到 JSON 的转换?如果一个关系被标记为惰性关系,它不会从数据库中加载,除非您的应用程序正在调用某些东西,例如该关系上的 getXXX。
  • 我想是的。如果我在存储库中的 findAll() 点进行调试,并检查它返回的内容,我可以看到用户对象,并在其中看到地址对象。在用户的地址中,我收到以下错误。方法引发了“java.lang.StackOverflowError”异常。无法评估 com.example.User.toString()
  • 我修复了上面的错误消息——这取决于 lombok 中包含的 toString() 方法。所以是的,即使我已经 fetch = lazy,它仍然在循环。
  • '它仍在循环' 究竟是什么循环?您如何在用户中确定这一点。 address.user.address 是在没有.. 获取的情况下获取的?某些东西可能会在您的模型上调用 getXXX - 您直接、您的序列化过程、toString 甚至是检查代码的 IDE。您使用的是哪个 JPA 提供程序?我刚刚检查过,您正在使用 oneToOne 映射,其中 JPA 提供程序可能需要“更多”,例如字节码增强以便能够为您处理延迟加载。 (即,映射看起来应该使用“映射者”和外键,而不是两者都使用它们的 ID 列)

标签: java spring jpa join repository


【解决方案1】:

这是正常行为。序列化器调用 getter 来序列化被 Hibernate Proxy 拦截的数据,即使它们是惰性的。为了防止这种情况,您必须将@JsonBackReference 添加到User 类中的address 字段,并将@JsonManagedReference 添加到user 类中的user 字段。

【讨论】:

  • 这成功了 - 返回结果的时间是之前时间的一小部分。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2019-11-19
相关资源
最近更新 更多