Hibernate добавить нового ребенка (ов) и обновить существующие - PullRequest
0 голосов
/ 01 мая 2018

У меня есть несколько объектов как 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)?

1 Ответ

0 голосов
/ 01 мая 2018

Обновление Hibernate следует использовать, если мы знаем, что мы обновляем только информацию об объектах.

попробуйте использовать

merge () => предпочтительный

или

saveOrUpdate ()

Подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...