2013-02-25 2 views
0

BookShelf와 Book간에 일대 다 관계가 있습니다. 서적 테이블의 ISBN 번호는 고유 한 필드입니다. 이제 일련의 도서 (같은 isbn 번호)를 사용하여 선반을 삽입하려고하면 제약 조건 위반 예외가 발생하고 books 테이블의 레코드가 삽입되지 않습니다. 문제는 선반 기록이 여전히 삽입된다는 것입니다. 최대 절전 모드로 한 선반 레코드와 해당 책 레코드를 트랜잭션 또는 일괄 처리에 삽입하지 마십시오. 내가 원하는 것은 중복 된 항목으로 인해 books 테이블에 삽입이 실패하면 선반 테이블 shud의 레코드가 삽입되지 않는다는 것입니다. 어떤 신체든지 이것을 달성하는 방법을 말해 줄 수 있습니다.자식 (child)의 고유 한 키 때문에 하나 이상의 많은 최대 절전 매핑에서 자식 삽입이 실패하지만 부모는 여전히 지속됩니다.

+0

Hibernate는 당신이하기 위해 그것을 지시한다. 트랜잭션 내에서 작업을 포함하고 문제가 발생하면 롤백합니다. – skuntsel

답변

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