在一对多hibernate映射中插入子项失败(因为子项中有唯一的键),但父项仍然被持久化

在一对多hibernate映射中插入子项失败(因为子项中有唯一的键),但父项仍然被持久化,hibernate,unique-constraint,one-to-many,Hibernate,Unique Constraint,One To Many,我在书架和书之间有一对多的关系。图书表中的ISBN编号是唯一字段。现在,当我尝试插入一个包含一组书籍(具有相同的isbn编号)的书架时,我得到一个约束冲突异常,并且不会插入books表中的记录。我的问题是,shelf记录仍然会被插入。不休眠在事务或批处理中插入单书架记录及其对应的账簿记录。我想要的是,如果在books表中插入由于重复条目而失败,那么shelf表中的记录将不会被插入。任何机构都可以告诉我如何实现这一点。请阅读本章,并使用您在其中找到的编程事务管理原则(13.2.1): 否则,请查找

我在书架和书之间有一对多的关系。图书表中的ISBN编号是唯一字段。现在,当我尝试插入一个包含一组书籍(具有相同的isbn编号)的书架时,我得到一个约束冲突异常,并且不会插入books表中的记录。我的问题是,shelf记录仍然会被插入。不休眠在事务或批处理中插入单书架记录及其对应的账簿记录。我想要的是,如果在books表中插入由于重复条目而失败,那么shelf表中的记录将不会被插入。任何机构都可以告诉我如何实现这一点。

请阅读本章,并使用您在其中找到的编程事务管理原则(13.2.1):


否则,请查找将为您处理事务和会话管理的容器管理事务。

检查persistence.xml 如果您没有使用JTA,您的事务类型应该是RESOURCE_LOCAL


java:/comp/env/jdbc/DS

检查一下这个样品

EntityManagerFactory emf = Persistence
        .createEntityManagerFactory("PU");
EntityManager em = emf.createEntityManager();
try {
  em.setFlushMode(FlushModeType.COMMIT);
  em.getTransaction().begin();

  BookShelf bs = new BookShelf();
  bs.setName("Adventure");

  Book b1 = new Book();
  b1.setTitle("Spider Man");
  bs.addBook(b1);

  Book b2 = new Book();
  b2.setTitle("Spider Man"); //Duplicate 
  bs.addBook(b2);

  em.persist(bs);
  try {
    em.getTransaction().commit();
  } catch (Throwable t) {
    t.printStackTrace();
    em.getTransaction().rollback();  
  }
} catch (Throwable t2) {
  t2.printStackTrace();
} finally {
  em.close();
  emf.close();
}
BookShelf.java

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "bookShelf")    
private List<Book> bookList;

public void addBook(Book book) {    
if (bookList == null) {
  bookList = new java.util.ArrayList<Book>();
}
book.setBookShelf(this);
bookList.add(book);       
}   
@OneToMany(cascade=CascadeType.ALL,orphaneremovation=true,mappedBy=“bookShelf”)
私人书单;
公开作废地址簿(簿册){
if(bookList==null){
bookList=new java.util.ArrayList();
}
book.setBookShelf(本);
图书目录。添加(图书);
}   

Hibernate执行您告诉它的操作。在事务中包含您的操作,并在出现问题时回滚它。
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "bookShelf")    
private List<Book> bookList;

public void addBook(Book book) {    
if (bookList == null) {
  bookList = new java.util.ArrayList<Book>();
}
book.setBookShelf(this);
bookList.add(book);       
}