У меня есть несколько объектов как
Chapter
до Section
OneToMany
(без таблицы соединений).
Section
до Attachment
OneToMany
(с таблицей соединений)
Я могу добавить / обновить / удалить Sections
, но не могу удалить вложения, поскольку вложения существуют в другой таблице. Мне просто нужно управлять таблицей соединений. Вот мои сущности.
Chapter.java
@Id
@Column(name = "CHAPTER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer chapterId;
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "chapter")
private List<Section> sections;
Section.java
@Id
@Column(name="SECTION_ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer sectionId;
@Column(name="SECTION_DESC")
private String sectionDesc;
@ManyToOne(fetch = FetchType.LAZY)
@JsonBackReference
@JoinColumn(name = "CHAPTER_ID", updatable = false)
private Chapter chapter;
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name="SECTION_ATTACHMENT",
joinColumns={@JoinColumn(name="SECTION_ID")},
inverseJoinColumns={@JoinColumn(name="ATTACHMENT_ID")})
private List<Attachment> attachments;
Attachment.java
@Id
@Column(name="ATTACHMENT_ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer attachmentId;
@Column(name="ATTACHMENT_NAME")
private String attachmentName;
@ManyToOne(fetch = FetchType.LAZY)
@JoinTable(name="SECTION_ATTACHMENT",
joinColumns={@JoinColumn(name="ATTACHMENT_ID")},
inverseJoinColumns={@JoinColumn(name="SECTION_ID")})
@JsonBackReference
private Section section;
ChapterResource.class
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/chapter/{chapterId}")
public Response updateChapter(@PathParam("chapterId") int chapterId, Chapter chapter) {
return chapterService.updateChapter(chapterId, chapter);
}
ChapterServiceImpl.class
@Override
public Response updateChapter(int chapterId, Chapter chapter) {
Session session = null;
try {
session = HibernateUtil.getSession();
dao.updateChapter(session, chapter);
HibernateUtil.closeSession(session);
} finally {
HibernateUtil.closeSession(session);
}
return Response.ok().build();
}
Dao.java
public void updateChapter(Session session, Chapter chapter) {
session.update(chapter);
}
Я создаю новую главу, используя почтовый звонок как
{
"sections":[
{
"sectionDesc":"first sectionDesc",
"attachments":[{
"attachmentId":1,
"attachmentName":"attachment1.docx"
}]
}]
}
при вызове GET глава
{
"chapterId":1,
"sections":[
{
"sectionDesc":"first sectionDesc",
"sectionId":1,
"attachments":[{
"attachmentId":1,
"attachmentName":"attachment1.docx"
}]
}]
}
теперь мне нужно обновить, используя PUT, как показано ниже
{
"chapterId":1,
"sections":[
{ //updating the existing attachment name
"sectionDesc":"first sectionDesc",
"sectionId":1, // this indicates existing section
"attachments":[{
"attachmentId":1,
"attachmentName":"test.pdf" // change of attachmentName should not delete the section, but has to update the
}]
},{ //adding new section here
"sectionDesc":"new sectionDesc",
// "sectionId":2, it should be auto increament during the insert
"attachments":[{
"attachmentId":10,
"attachmentName":"sampleDoc.ppt"
}]
}]
}
когда я выполняю PUT-вызов для моего API, я не получаю никаких ошибок или предупреждений, но записи не изменяются в БД, как в теле тела put.
Пробовал много следов и ошибок, но я не мог понять, где я иду не так.
Может ли кто-нибудь помочь мне, если это достижимо с помощью hibernate(5)
?