2017-01-26 14 views
0

複数のエンティティに保持しようとしています。以下のサンプルコード:persist()を複数回呼び出すときにデータが保存されない

public List<String> save(SalesInvoice salesInvoice, List<ClosingStock> closingStockList, Company company, 
     Receipt receipt) { 

    log.info("Saving Sales Invoice..."); 
    if (salesInvoice.getSalesChallanId() == null) { 
     for (ClosingStock closingStock : closingStockList) { 
      if (existingClosingStock(closingStock.getProduct().getId().toString()) == null) { 
       em.persist(closingStock); 
      } else { 

      } 
     } 
    } 
    em.persist(salesInvoice); 
    receipt.setSalesInvoiceId(salesInvoice.getId()); 
    em.persist(receipt); 
    return null; 
} 

// Edit: Add existingClosingStock method provided in comments 

public ClosingStock existingClosingStock(String productId) { 
    try { 
     return (ClosingStock) em.createQuery("SELECT cv FROM ClosingStock cv WHERE cv.product.id=:productId") .setParameter("productId", productId).getSingleResult(); 
    } catch (NoResultException e) { 
     return null; 
    } 
} 

私はこのクエリを実行するとまあ、データはデータベースに保持されませんでしたが、それは小さな回のために新たに挿入されたデータのリストを示していますが、データはデータベースに保存されませんでした。私はコンソールで何のエラーもありません。また戻りません前にem.getTransaction().commit();を置く。私は単一のエンティティで永続化しようとしたときにem.getTransaction().commit();を置くと、完全に機能しました。このように:

public void save(Location location) { 
    log.info("Saving Location."); 
    em.persist(location); 
    em.getTransaction().commit(); 
} 

私はここで何を欠席しましたか?

+0

'existingClosingStock'メソッドを教えてください。デバッグモードで、nullを返して永続化を行うかどうかをチェックしようとしましたか? –

+1

JPA仕様に準拠するには、常にtx.commit(およびtx.begin)が必要ですが、表示されていません。そして、あなたはそれをデバッグする –

+0

@Matthieu \t公共ClosingStock existingClosingStock(文字列のProductID){ \t \t試し{ \t \t \tリターン(ClosingStock)em.createQuery ClosingStock FROM( "SELECT CV、を見て、あなたのJPAプロバイダのログを持っていますcv WHERE cv.product.id =:productId ") \t \t \t \t \t .setParameter(" productId "、productId).getSingleResult(); \t \t} catch(NoResultException e){ \t \t \t return null; \t \t @ – pralad

答えて

0

this articleで説明されているように、entity state transitionをスケジュールするだけです。インサートは、フラッシュ中に実行されます。トランザクションをコミットしないと、フラッシュは自動的にトリガーされません。

とにかく、データを読み込む予定がある場合でも、常にトランザクションを開始する必要があります。

関連する問題