0

BookShelfとBookの間には1対多の関係があります。ブックテーブルのISBN番号は一意のフィールドです。ここで、(同じisbn番号の)本のセットを含む棚を挿入しようとすると、制約違反の例外が発生し、booksテーブルのレコードが挿入されません。私の問題は、棚のレコードがまだ挿入されていることです。1つのシェルフレコードとそれに対応するブックレコードをトランザクションまたはバッチに休止状態で挿入しません。私が欲しいのは、重複したエントリのために本のテーブルへの挿入が失敗した場合、棚のテーブルのレコードは挿入されないことです。どんな体でもこれを達成する方法を教えてください。

4

2 に答える 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();
}

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);       
}   
于 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 に答える