@ManyToOne更新/删除级联中的对象,父级 - 子级

时间:2016-01-14 17:50:30

标签: java hibernate java-ee

我在Hibernate 4.2中使用了DTO,但我在Cascade我的DTO中更新时遇到了问题,当我删除一个孩子时,我无法更新此更改。

我有像这样的@Bidirectional关系:

Book 1-M - Page - 1-M Line

课程预订

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "book")
    private Set<Page> pages;

课程页面

@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "book_id", nullable = false)
    private Book book;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "page")
    private Set<Line> lines;

当我收到DTO时,我会对Hibernate对象进行映射以实现更改,但是当一个Children有4个对象时,我删除2,当我更新Parent时,Hibernate不会这样做。什么都不做。

public Long updateBook(BookDTO BookDto) {
        Session session = HibernateSessionFactory.getSessionFactory().openSession();

        Book Book = new Book();

        try {
            session.beginTransaction();

            Book = (Book) session.get(Book.class, BookDto.getId());

            Book.setTitle(BookDto.getTitle());
            Book.setDescription(BookDto.getDescription());

            //Pages
            if (BookDto.getPages() != null){

                Set<PageDTO> pagesDto = BookDto.getPages();
                Set<Page> pages = new HashSet<Page>();

                for (PageDTO pageDto : pagesDto) {
                        Page page = new Page();
                        page.setId(pageDto.getId());
                        page.setSequence(pageDto.getSequence());
                        page.setBook(Book);

                        Set<LineDTO> linesDto = pageDto.getLines();
                        Set<Line> lines = new HashSet<Line>(); 

                        for (LineDTO lineDto : linesDto) {
                            Line line = new Line ();
                            linesetId(lineDto.getId());
                            linesetPage(page);

                            lines.add(line);    
                      }
                  }
                    page.setLines(Lines);
                    pages.add(page);
                }                           
                Book.setPages(pages);   
                }                           
            }
            session.update(Book);

            session.getTransaction().commit();
        } catch (Exception e) {
            logger.error("Error updating Book :" + e);
            session.getTransaction().rollback();
        } finally {
            session.close();
        }
    }

使用此代码,我将对象簿中的信息设置为DTO,如果用户删除了三个&#34; Linies&#34;在对象页面中,我没有设置这个信息,我想当我更新对象书时,Hibernate必须自动删除对象与父对象的关系,在使用DTO之前,这个例子工作得很好使用模型类我猜这个问题来自分离的对象。

1 个答案:

答案 0 :(得分:1)

默认情况下,孤立删除设置为false。

如果要在类中更新集合时删除孤立,则应在父级级别的 @OnetoMany 注释中声明。

在您的情况下,您可能希望更新映射,如下所示:

课本:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "book", orphanRemoval=true)
private Set<Page> pages;

课程页面

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "page", orphanRemoval=true)
private Set<Line> lines;

有关详细信息,请参阅Hibernate 4.3 Reference example one-to-many with orphan removal