在JPA中,如何知道entityManager.persist(obj)是否已将对象持久化到数据库中?

时间:2016-12-28 13:52:29

标签: java database hibernate jpa sql-insert

使用Entity Manager,我们怎么知道插入数据库的行..

  public String insert(Object obj, String idGen){

        try{
            entityManager.getTransaction().begin();
            if (idGen == "auto") {
                entityManager.persist(obj); // here how to confirm the object was inserted or not into database
            } else if (idGen == "manual") {
                entityManager.persist(obj); // here how to confirm the object was inserted or not into database
            }
            entityManager.getTransaction().commit();
        }catch(Exception e){
            e.printStackTrace();
        }

        return "Inserted Row";

    }

2 个答案:

答案 0 :(得分:2)

代码的第一个问题是错误的字符串比较,在比较字符串时应使用equals()方法而不是==。有关详细信息,请参阅How do I compare strings in Java?

说过你的代码可以大大改进如下:

public String insert(Object obj, String idGen) {
    if ("auto".equals(idGen) || "manual".equals(idGen)) {
        try {
            entityManager.getTransaction().begin();
            entityManager.persist(obj);
            entityManager.getTransaction().commit();
            return "Inserted row";
        } catch (Exception ex) {
            e.printStackTrace();
            return String.format("Insertion failed: %s", ex.toString());
        }
    } 
    return String.format("Object not inserted because of idGen value: %s", idGen);
} 

通过这种方式,您不会创建事务,至少您是完全肯定的,您必须在数据库中插入对象,从而节省了事务管理的成本。如果不是if-else if阻止,你还只测试了两个阳性病例。

现在,回到最初的问题,上面提供的代码应足以测试对象是否已插入数据库。但是你总是可以使用本地数据库连接自己测试它。

提示

捕获一般异常不是一个好习惯,我们应该抓住特定的异常。例如,查看EntityManager#persist(),我们可以看到此方法可以抛出EntityExistsExceptionIllegalArgumentExceptionTransactionRequiredException。因此,捕获这些异常比通用Exception类型更有意义。

答案 1 :(得分:2)

entityManager.persist(obj); // here how to confirm the object was inserted or not into database

我假设你在调试时跨过了这一行,并且看到数据库中没有出现新记录。

不用担心,实体经理足够聪明,知道它可以等到反映数据库中的更改,直到您实际提交事务为止。方法EntityManager.persist(obj)仅告诉实体管理器obj现在是持久的 - 现在将跟踪其状态的更改,并且需要在数据库结束时创建存储其状态的新记录。最迟的交易。

有时,您需要将数据插入数据库的副作用(例如,您需要在保留实体后检索自动生成的ID)。对于此类用例,您可以调用EntityManager.flush()强制将挂起的更改保留到数据库。如果需要,您仍然可以在刷新后回滚事务。