我在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之前,这个例子工作得很好使用模型类我猜这个问题来自分离的对象。
答案 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