我有一个带有注入的EntityManager em的托管无状态会话bean。
我要做的是拥有一个具有唯一列的数据库表。然后我运行一些试图插入实体的算法。如果实体存在,则会更新或跳过它。
我想有这样的事情:
try {
em.persist(cd);
em.flush();
} catch (PersistenceException e) {
// Check if the exception is DatabaseException and ConstraintViolation
// Update instead or skip it
}
问题是我只能抓住PersistenceException
。 DatabaseException
没有被捕获。很遗憾,因为只有DatabaseException
有一个名为getDatabaseErrorCode()
的方法,我想用它来检查重复的条目。我不明白,因为PersistenceException.getCause()
会返回DatabaseException
。
所以我的问题是:如何捕获DatabaseException
并检查MySQL错误代码?
感谢您对此有任何想法和经验。
答案 0 :(得分:6)
我有一个建议,我在我的申请中使用。我们可以从SQLException
检索PersistenceException
。之后,尝试sql error code
获取SQLException
。如果您要求获得sql error code
,则可以按照我的示例进行操作;
public void insert(Group group) throws DAOException {
try {
//your operation
em.flush();
logger.debug("insert() method has been successfully finisehd.");
} catch (PersistenceException pe) {
String sqlErroCode = getErrorCode(pe);
// do your operation based on sql errocode
}
}
protected String getErrorCode(RuntimeException e) {
Throwable throwable = e;
while (throwable != null && !(throwable instanceof SQLException)) {
throwable = throwable.getCause();
}
if (throwable instanceof SQLException) {
Properties properties = --> load sql error code form configuration file.
SQLException sqlex = (SQLException) throwable;
String errorCode = properties.getProperty(sqlex.getErrorCode() + "");
return errorCode;
}
return "NONE";
}
mysql的错误代码配置
mysql_error_code.properties
#MySQL Database
1062=DUPLICATE_KEY_FOUND
1216=CHILD_RECORD_FOUND
1217=PARENT_RECORD_NOT_FOUND
1048=NULL_VALUE_FOUND
1205=RECORD_HAS_BEEN_LOCKED