多次调用persist()时数据不会保存

时间:2017-01-26 09:43:32

标签: java hibernate jpa

我试图坚持多个实体。示例代码如下:

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

我在这里想念的是什么?

1 个答案:

答案 0 :(得分:0)

正如this article中所述,坚持只计划entity state transition。插入在刷新期间执行。如果您不提交事务,则不会自动触发刷新。

无论如何,即使您打算阅读数据,也应该始终开始交易。