【问题标题】:org.postgresql.util.PSQLException: ERROR: insert or update on table violates foreign key constraintorg.postgresql.util.PSQLException:错误:插入或更新表违反外键约束
【发布时间】:2019-06-16 16:56:51
【问题描述】:
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);

请检查我的代码并告诉我哪里出错了

【问题讨论】:

    标签: postgresql spring-boot jpa foreign-keys sql-insert


    【解决方案1】:

    如果列具有外键约束,则该列的任何条目都应存在于给定的引用表中。如果不是,则抛出此异常。

    【讨论】:

    • 我不知道 spring-boot。但我认为在表 party_custom_fields 中,您的列上有一个 foreign_key 约束。如果您在 sub_table_column 上有 外键约束,则所有 要插入的值到该列 应该已经存在于 parent_table_column
    • 我如何用 sql 解决问题,而不是 JpaRepository,我使用了与 jpa 相同的实体管理器,它工作正常
    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2013-09-06
    • 2011-01-27
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2021-12-12
    • 2015-08-19
    相关资源
    最近更新 更多