我在 BookShelf 和 Book 之间有一对多的关系。book 表中的 ISBN 号是一个唯一字段。现在,当我尝试插入带有一组书籍的书架(具有相同的 isbn 编号)时,我得到了一个违反约束的异常,并且未插入书籍表中的记录。我的问题是,货架记录仍然被插入。hibernate 不会在事务或批次中插入一个书架记录及其对应的书籍记录。我想要的是,如果由于重复条目而导致书籍表中的插入失败,那么书架表中的记录不会被插入。任何机构都可以告诉我如何实现这一目标。
问问题
776 次
2 回答
0
如果您不使用 JTA,请检查您的 persistence.xml,您的事务类型应为 RESOURCE_LOCAL
<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>java:/comp/env/jdbc/DS</non-jta-data-source>
检查这个样本
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();
}
书架.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);
}
于 2013-04-30T06:15:26.517 回答
0
阅读Hibernate 官方文档的事务和并发一章,并使用您在其中找到的程序化事务管理原则(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();
}
否则,请寻找将为您处理事务和会话管理的容器管理事务。
于 2013-02-25T12:28:35.820 回答