2013-02-25 41 views
0

我在BookShelf和Book之间有一对多的关系。书籍表中的ISBN编号是一个独特的字段。现在当我尝试插入书架(具有相同的isbn数字)的书架时,我得到一个约束冲突异常,并且书籍表中的记录未插入。我的问题是,货架记录仍然被插入。不休眠在事务或批次中插入一个货架记录及其相应的书记录。我想要的是,如果书籍表中的插入由于重复条目而失败,则不会插入货架表中的记录。请告诉我如何实现这一目标。儿童插入在一对多的hibernate映射中失败(因为儿童中有一个唯一的键),但父母仍然持续

+0

Hibernate做你告诉它做的事情。将事务包含在事务中并在出现问题时进行回滚。 – skuntsel 2013-02-25 12:24:48

回答

0

阅读第Transaction and concurrency of Hibernate official documentation和应用程序性交易管理原则,你发现有(13.2.1):

Session sess = factory.openSession(); 
Transaction tx = null; 
try { 
    tx = sess.beginTransaction(); 
    //do your database work 
    tx.commit(); 
} 
catch (RuntimeException e) { 
    if (tx != null) tx.rollback(); 
    throw e; // or display error message 
} 
finally { 
    sess.close(); 
} 

否则,寻找容器管理的事务将要处理的事务和会话管理你。

0

,如果你不使用JTA事务处理的类型应该是RESOURCE_LOCAL

<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>java:/comp/env/jdbc/DS</non-jta-data-source>

检查该样本检查您的persistence.xml

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);  
}