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();
}
私はここで何を欠席しましたか?
'existingClosingStock'メソッドを教えてください。デバッグモードで、nullを返して永続化を行うかどうかをチェックしようとしましたか? –
JPA仕様に準拠するには、常にtx.commit(およびtx.begin)が必要ですが、表示されていません。そして、あなたはそれをデバッグする –
@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