首页 > 解决方案 > Spring Data JPA - 一对一映射双向

问题描述

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

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

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

在 SymbolsHistical 中,

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

我在符号课上做过,

@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-bootspring-data-jpahibernate-mapping

解决方案


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

所以映射必须在Symbols类中:

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

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

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

例如

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

推荐阅读