Класс прикрепления:
@Entity
@Table(name="attachments")
@Getter
@Setter
public class AttachmentModel {
//@EmbeddedId
//private AttachmentId attachmentId;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="notice_attachment_id")
private long attachmentId;
@Column(name="notice_id")
private long noticeId;
@Column(name="attachment")
private String attachmentUrl;
@JsonIgnore
@ManyToOne(cascade = {CascadeType.PERSIST , CascadeType.MERGE,
CascadeType.DETACH , CascadeType.REFRESH},optional = false)
@JoinColumn(name="notice_id", insertable=false, updatable=false)
@MapsId("notice_id")
NoticesModel notice;
public void addNotice(NoticesModel notice) {
this.notice = notice;
}
public AttachmentModel() {
}
}
Класс уведомлений:
@Entity
@Table(name = "notices")
@Getter @Setter
public class NoticesModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "notice_id" ,updatable = false, nullable = false,insertable = true)
private long noticeID;
@OneToMany(fetch = FetchType.EAGER, cascade = { CascadeType.ALL } , mappedBy = "notice")
//@mappedBy(name = "notice_id")
private List<AttachmentModel> attachments;
}
Код для анализа JSON и его сохранения
public HashMap<String,Object> saveNotices(@RequestBody List<NoticesModel> tmpNotices)
{
List<NoticesModel> notices = tmpNotices;
for (NoticesModel notice : notices) {
List<AttachmentModel> attachments = notice.getAttachments();
for (AttachmentModel attachment : attachments) {
attachment.addNotice(notice);
System.out.println(attachment.getAttachmentUrl());
}
for (AttachmentModel attachment : attachments) {
//attachment.addNotice(notice);
System.out.println(attachment.getNotice().getContent());
System.out.println(attachment.getNotice().getNoticeID());
}
}
int result = noticesServices.saveNotice(notices);
HashMap<String,Object> res = new HashMap<>();
res.put("message",result);
return res;
}
Это мой JSON, который я отправляю
[
{
"attachments": [
{
"attachmentUrl": "/abc/bcd"
}
],
"content": "string",
}
]
В этом случае я пытаюсь сохранить свое уведомление и приложение.
в этом конкретном случае создается уведомление_id при сохранении в базу данных.
поэтому, пытаясь сохранить таблицу вложений, она пытается сохранить с параметром note_id, равным 0.
поэтому я получаю исключение.
не удалось выполнить оператор; SQL [н / п]; ограничение [attachments_notices_fk]; вложенное исключение: org.hibernate.exception.ConstraintViolationException: не удалось выполнить оператор
Как я могу решить эту проблему?
Можно ли получить уведомление_id перед сохранением в БД, чтобы я мог получить note_id , чтобы я мог установить его во вложении, чтобы он не был сохранен с 0?
Что я делаю неправильно (любой альтернативный подход, который я могу использовать) в этом случае (я довольно новичок в JPA и Springboot)?