【问题标题】:Spring Data JPA - one to one mapping bidirectionalSpring Data JPA - 一对一映射双向
【发布时间】:2021-09-15 18:51:25
【问题描述】:

我有一个叫做符号和符号历史的表,

 Symbols
    symbols(Pk)
    
 SymbolsHistorical
    id
    symbols
    Forign key name - symbols_fk (FK)

我创建了我的 HibernateMapping 并在我的 DTO 类中,

在 SymbolsHistorical 中,

@OneToOne
@JoinColumn(foreignKey = @ForeignKey(name = "symbols_fk"))
private Symbols symbol;

我在 Symbols 课上做过,

@OneToOne(mappedBy = "symbol")
private SymbolsHistorical symbolsHistorical;

每当我需要读取符号时,我也需要它的 symbolsHistorical,

我正在使用 findBySymbol 方法获取符号数据。每当我进行上述映射时,我都会得到, “字段列表”中的未知列“symbols0_.symbols_historical_id”

做错了什么?

更新:

Error 
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
    at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755)

[2m2021-07-05 15:31:29.458[0;39m [31mERROR[0;39m [35m76390[0;39m [2m---[0;39m [2m[nio-8080-exec-1][0;39m [36ms.e.ErrorMvcAutoConfiguration$StaticView[0;39m [2m:[0;39m Cannot render error page for request [/symbols/A] and exception [] as the response has already been committed. As a result, the response may have the wrong status code.

【问题讨论】:

    标签: spring-boot spring-data-jpa hibernate-mapping


    【解决方案1】:

    从您的表中获取外键名称是符号。

    所以映射必须在Symbols类中:

    @OneToOne
    @JoinColumn(name="symbols")
    private Symbols symbol;
    

    当您使用 JSON 序列化时,由于双向映射,您将收到 StackOverflowError。

    因此,您必须向 SymbolSymbolsHistorical 类添加注释(取决于您要序列化的内容)以打破循环。

    例如

    @JsonBackReference // this property will not be serialized
    @OneToOne(mappedBy = "symbol")
    private SymbolsHistorical symbolsHistorical;
    

    【讨论】:

    • 感谢您的回复。更新了问题。 symbols 是外键列名,外键名是symbols_fk。我认为它是不言自明的。
    • 你试过我的答案了吗?
    • 我在 SymbolHistorical 类中添加了这个。这将在读取符号历史时获取符号。我添加了 @OneToOne(mappedBy = "symbol") private SymbolsHistorical symbolsHistorical;在符号中,但正在无限循环,因为符号正在返回符号历史,而符号历史正在返回符号。
    • 你在使用 Lombok 吗?或者是什么造成了无限循环?
    • 是的,我正在使用 Lombok。会不会产生问题?我还更新了收到的错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多