使用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";
}
答案 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(),我们可以看到此方法可以抛出EntityExistsException
,IllegalArgumentException
或TransactionRequiredException
。因此,捕获这些异常比通用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()
强制将挂起的更改保留到数据库。如果需要,您仍然可以在刷新后回滚事务。