Джексон - Двунаправленный - Идентификатор родительского десериализации - PullRequest
0 голосов
/ 18 апреля 2020

У меня проблемы с заполнением сущности файлом json при наличии двунаправленного отношения.

Родительский класс:

@Entity
@Table(name = ".....")
public class CpoPipeline implements... {

    private String pipelineId;
    private String pipelineSource;
    private String pipelineVersion;
    private Set<CpoPipelineParameter> cpoPipelineParameters;

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "cpoPipeline")
    public Set<CpoPipelineParameter> getCpoPipelineParameters() {
        return this.cpoPipelineParameters;
    }

Дочерний класс:

@Entity
@Table(name = ".....")
public class CpoPipelineParameter implements ...{

    private String pipelineParameterId;
    private CpoPipeline cpoPipeline;
    private String pipelineParameterName;
    private String pipelineParameterValue;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "pipeline_id", nullable = false)
    @JsonIgnore
    public CpoPipeline getCpoPipeline() {
        return this.cpoPipeline;
    }

Json:

{
    "cpoPipeline": {
    "pipelineId": "1",
    "pipelineSource": "C://",
    "pipelineVersion": "2.0",
    "cpoPipelineParameters": [
        {
        "pipelineParameterId": "2",
        "pipelineParameterName": "Process_Group_Variable_Year",
        "pipelineParameterValue": "2020"
        },
        {
        "pipelineParameterId": "1",
        "pipelineParameterName": "Process_Group_Variable_Directory",
        "pipelineParameterValue": "C://"
        }
    ]
    }
}

Когда я пытаюсь заполнить сущность файлом json, родительский идентификатор не входит в дочернюю сущность. Поэтому, когда я пытаюсь сохранить, я получаю сообщение об ошибке:

17: 26: 54.714 [main] ОШИБКА ohejdb c .spi.SqlExceptionHelper - NULL не допускается для столбца "PIPELINE_ID"; SQL оператор: вставить в cpo_pipeline_parameter (pipe_id, pipe_parameter_name, pipe_parameter_value, pipe_parameter_id) значения (?,?,?,?)

1 Ответ

1 голос
/ 18 апреля 2020

Вам нужно установить CpoPipeline для каждого CpoPipelineParameter. В двунаправленном отношении, если вы хотите сохранить родителя с потомком, вам нужно установить родителя для каждого потомка, чтобы обе стороны синхронизировались c.

cpoPipeline.getCpoPipelineParameters().forEach(d -> d.setCpoPipeline(cpoPipeline));
...