【发布时间】: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