我正在尝试将一个条目插入到我的数据库中,该条目与另一个实体具有一对一的关系。我正在使用 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)
注释应该在数据库中创建必要的条目。预先感谢。
很简单,您从未将
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;
}