BookShelf와 Book간에 일대 다 관계가 있습니다. 서적 테이블의 ISBN 번호는 고유 한 필드입니다. 이제 일련의 도서 (같은 isbn 번호)를 사용하여 선반을 삽입하려고하면 제약 조건 위반 예외가 발생하고 books 테이블의 레코드가 삽입되지 않습니다. 문제는 선반 기록이 여전히 삽입된다는 것입니다. 최대 절전 모드로 한 선반 레코드와 해당 책 레코드를 트랜잭션 또는 일괄 처리에 삽입하지 마십시오. 내가 원하는 것은 중복 된 항목으로 인해 books 테이블에 삽입이 실패하면 선반 테이블 shud의 레코드가 삽입되지 않는다는 것입니다. 어떤 신체든지 이것을 달성하는 방법을 말해 줄 수 있습니다.자식 (child)의 고유 한 키 때문에 하나 이상의 많은 최대 절전 매핑에서 자식 삽입이 실패하지만 부모는 여전히 지속됩니다.
0
A
답변
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
당신이
<persistence-unit name="PU" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>java:/comp/env/jdbc/DS</non-jta-data-source>
확인이 샘플 RESOURCE_LOCAL해야 JTA에게 당신의 거래 유형을 사용하지 않는 경우의 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);
}
Hibernate는 당신이하기 위해 그것을 지시한다. 트랜잭션 내에서 작업을 포함하고 문제가 발생하면 롤백합니다. – skuntsel