【问题标题】:Spring Boot JPA One-to-One mapping generates StackOverflow ErrorSpring Boot JPA 一对一映射生成 StackOverflow 错误
【发布时间】:2019-11-08 18:16:01
【问题描述】:

尝试在 MySQL 上运行 Spring-Boot JPA 并在此处按照本教程进行操作:https://spring.io/guides/gs/accessing-data-mysql/ 一切顺利如预期。

但是,当我引入了一个新的实体即。用户地址和建立的 1 对 1 单向映射,应用程序开始抛出 StackOverFlow 错误 - 即使映射非常基本,我已经在应用服务器(例如 GlassFish/Payara 5)上使用过几次没有问题。

下面是映射:

User实体中

@OneToOne(mappedBy = "user", optional = false, cascade = CascadeType.ALL)
private Address address;

..关系的另一端,即Address

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

预期:单行:{"id":1,"name":"First","email":"someemail@someemailprovider.com","address":{"id":2,"line1":"Line1","postcode":"PST CD","city":"City","state":"State","country":"IN"

实际:上面的行在控制台上打印了无数次,这是一个 StackOverflow 错误。

【问题讨论】:

    标签: mysql spring-boot jpa-2.0 one-to-one


    【解决方案1】:

    如果您的意思是“无限递归 (StackOverflowError)”。

    您可能需要将@JsonIgnore 添加到映射参数(在您的onetoone 关系之上)以停止循环。

    【讨论】:

    • 但是@JsonIgnore 魔法是如何工作的?毫无疑问,它可以工作,但不是很直观!
    • 我怀疑尝试转换对象图的序列化程序不知道它一次又一次地浏览相同的对象。从而产生堆栈溢出错误。
    • user.address -> 地址实例,Address.user -> 用户实例
    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2021-09-15
    相关资源
    最近更新 更多