表上的插入或更新违反了外键约束,表中不存在键

问题描述 投票:0回答:1

我正在尝试将一个条目插入到我的数据库中,该条目与另一个实体具有一对一的关系。我正在使用 spring data jpa 和 postgres。

我的代码如下:

@MappedSuperclass
@Getter
@Setter
@ToString
public abstract class Post {

    @Id
    @GeneratedValue
    private Long id;

    private Long botId;

    private String description;

    private boolean hasBeenUsed;

    @Column(length = 1000)
    private String imageUrl;

    @CreationTimestamp  
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;  

}
@Entity
@Getter
@Setter
@ToString
public class PollPost extends Post {
    @OneToOne(cascade = CascadeType.ALL)
    private PollPostImageTextData pollImageTextData;
}
@Entity
@Getter
@Setter
@ToString
public class PollPostImageTextData {

    @Id
    @GeneratedValue
    private Long id;
    private String question;
    private String answerA;
    private String answerB;
    private String correctAnswer;
}

如果我现在尝试按如下方式创建 PollPost:

protected PollPost createPollPost(long botId) throws IOException {

        System.out.println("Generating Poll Post...");

        String textData = "{\n  \"question\": \"sample question?\",\n  \"answerA\": \"sample answerA\",\n  \"answerB\": \"samepleAnswerB\",\n  \"correctAnswer\": \"answerB\"\n}";
        String description = "sample desc";

        ObjectMapper mapper = new ObjectMapper();
        PollPostImageTextData pollImageTextData = new PollPostImageTextData();
        try {
            System.out.println("Generating image text data...");
            pollImageTextData = mapper.readValue(textData, PollPostImageTextData.class);
            System.out.println(pollImageTextData);
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (pollImageTextData == null) {
            throw new IllegalStateException("Poll Image Text Data must not be null");
        }

        String imageUrl = "test url";
        PollPost post = new PollPost();
        post.setPollImageTextData(pollImageTextData);
        post.setDescription(description);
        post.setHasBeenUsed(false);
        post.setBotId(botId);
        post.setImageUrl(imageUrl);

        System.out.println("Saving PollPost with PollImageTextData ID: " + (pollImageTextData.getId() != null ? pollImageTextData.getId() : "null"));

        pollPostRepository.save(post);
        return post;
    }

我收到错误:

org.springframework.dao.DataIntegrityViolationException: could not execute statement [ERROR: insert or update on table "poll_post" violates foreign key constraint "fk1db3khk0i1jc6mehnod8fy4r" Detail: Key (poll_image_text_data_id)=(852) is not present in table "poll_image_text_data".
我不确定为什么会发生这种情况,因为 PollImageTextData 的
@OneToOne(cascade = CascadeType.ALL)
注释应该在数据库中创建必要的条目。预先感谢。

java spring postgresql hibernate jpa
1个回答
0
投票

很简单,您从未将

pollImageTextData
保存到数据库中,因此当您尝试保存
post
时,它会在
PollPostImageTextData
表中查找不存在的行。

只需为

PollPostImageTextData
创建存储库并在保存
pollImageTextData
之前保存
post

protected PollPost createPollPost(long botId) throws IOException {

    System.out.println("Generating Poll Post...");

    // create PollPostImageTextData pollImageTextData ...

    // save it
    pollPostImageTextDataRepository.save(pollImageTextData);

    // create PollPost post ...

    pollPostRepository.save(post);
    return post;
}
© www.soinside.com 2019 - 2024. All rights reserved.