org.postgresql.util.PSQLException: ОШИБКА: вставка или обновление таблицы нарушает ограничение внешнего ключа - PullRequest
0 голосов
/ 23 января 2019
org.postgresql.util.PSQLException: ERROR: insert or update on table "party_custom_fields" violates foreign key constraint "fk21oqkpi7046skme7jce06fxdu"

Ниже ошибка может помочь, что нужно сделать с кодом, я пробовал несколько ссылок, но не помогло.

Detail: Key (custom_field_value)=(11) is not present in table "custom_field_value"

Выше моя ошибка при сохранении.

Party - это класс, который будет иметь настраиваемые поля и данные


import lombok.Data;

import javax.persistence.*;
import java.util.HashMap;
import java.util.Map;

@Entity
@Data
@Table(name = "party")
public class Party {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @Column(name = "last_name")
    private String lastName;
    private String email;
    private String gender;
    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "party_custom_fields",
            joinColumns = {@JoinColumn(name = "custom_field")},
            inverseJoinColumns = {@JoinColumn(name = "custom_field_value")})
    @MapKeyColumn(name = "custom_field_key")
    private Map<Long, CustomFieldValue> customField = new HashMap<>();
    public Party() {
    }
    public Party(String name) {
        this.name = name;
    }

}

Модель значений пользовательских полей

package org.aeq.multitenant.model;

import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "custom_field_value")
public class CustomFieldValue {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String value;

}

Модель настраиваемых полей, в которой содержатся настраиваемые поля для таблиц

package org.aeq.multitenant.model;

import lombok.Data;
import org.aeq.multitenant.enums.Tables;

import javax.persistence.*;

@Data
@Entity
@Table(name = "custom_field")
public class CustomField {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String type;
    private boolean optional;
    @Enumerated(EnumType.STRING)
    @Column(name = "table_name")
    private Tables tableName;
}

Функция контроллера для сохранения

 Map<Long, CustomFieldValue> cfMap = new HashMap<>();

        for (CustomField cf : customFields) {
            if (!partyData.containsKey(cf.getName())) {
                return new ApiResult<>(false, "Please provide " + cf.getName() + " custom field of party");
            } else {
                CustomFieldValue cfv = new CustomFieldValue();
                cfv.setValue(partyData.get(cf.getName()).trim());
                cfv = customFieldValueRepository.save(cfv);
                cfMap.put(cf.getId(), cfv);
            }
        }

        Party party = new Party();
        party.setName(partyData.get("name"));
        party.setEmail(partyData.get("email").trim());
        party.setGender(partyData.get("gender").trim());
        party.setLastName(partyData.get("last_name").trim());
        party.setCustomField(cfMap);

        party = partyRepository.save(party);

пожалуйста, просмотрите мой код и сообщите мне, где я ошибаюсь

1 Ответ

0 голосов
/ 23 января 2019

Если столбец имеет ограничение внешнего ключа, то любая запись в этом столбце должна присутствовать в заданной справочной таблице. Если нет, то будет выдано это исключение.

...