【问题标题】:Hibernate logs from console as exceptions从控制台休眠日志作为异常
【发布时间】:2017-01-28 18:20:39
【问题描述】:

我在 Spring 上的 Web 应用程序中使用 Hibernate。我在控制器中使用 try catch 块的方法,如果一切正常,我设置重定向参数“success == true”,如果出现问题,我使用“error == true”。 有用。但有时在我的控制台中休眠会向我显示警告,例如:

2017-01-28 19:13:44.253  WARN 4532 --- [nio-8080-exec-8] o.hibernate.util.JDBCExceptionReporter   : SQL Error: 1062, SQLState: 23000
2017-01-28 19:13:44.253 ERROR 4532 --- [nio-8080-exec-8] o.hibernate.util.JDBCExceptionReporter   : Duplicate entry 

我只想在 try catch 块中捕获这些警告,因为如果我尝试将新条目添加到数据库中 - 在这种情况下 - 重复条目然后在 try catch 块中所有内容都被接受并且我得到信息“操作成功”但是它不是。 我试图捕捉不同的异常,如 SQLException、HibernateException,甚至是一般的异常。但它不起作用。对于添加、更新、删除条目等操作,我使用 'void' 方法,因此我无法返回一些值。

是否可以从控制台捕获这些警告/错误以及如何捕获?

@RequestMapping(value="/adduserdb", method=RequestMethod.POST)
    public String addUserToDb(@ModelAttribute(value="userform") User user, RedirectAttributes redirectAttributes) {
        try {
            userService.createBasicUser(user);  
            redirectAttributes.addAttribute("success", true);

            return "redirect:/admin/user/adduser";
        } catch(Exception e) {
            redirectAttributes.addAttribute("error", true);

            return "redirect:/admin/user/adduser";
        }
    }

这是我的一种方法示例,但它不起作用。

【问题讨论】:

  • 您确定确实引发了异常吗? “抓住不抓住”和“没有抓住”之间会有区别。也许 userService 会处理它?

标签: java spring hibernate


【解决方案1】:

打印这些错误是休眠的默认性质。如果您只想隐藏日志,则可以禁用以下软件包的日志。在弹簧靴中,就像

logger.level.org.hibernate.util=OFF

但不建议这样做,因为其他相关日志可能会被忽视。

在您的情况下,您可以在插入之前检查记录是否已经存在,从而避免错误本身的需要。

boolean isUserExist = userService.isUserExist(user.getName());
if(!isUserExist){
    userService.createBasicUser(user);  
    redirectAttributes.addAttribute("success", true)
else {
    redirectAttributes.addAttribute("error", true);
    return "redirect:/admin/user/adduser";
}

虽然可能会在两个服务调用之间添加另一个用户,但可以使用全局异常处理程序将其作为一种特殊情况进行处理,该处理程序会显示一般错误消息,因为这种可能性较小(取决于应用程序)

【讨论】:

  • 这是我想要但不完全的东西。在这种情况下,我总是必须检查数据库中是否存在用户或其他对象,这意味着对 db 的下一个 sql 查询。 Hibernate 总是在出现问题时抛出 HibernateException - 即使在这种情况下重复条目。问题是我无法捕捉到这个异常。我的 DAO 方法使用:“抛出 HibernateException”,但在控制器中,这个异常甚至一般的“异常”都无法捕捉到。这是我真正的问题。
  • 您可以通过打印exception.getClass() 找到确切的异常类,然后修改您的代码以捕获它。但是这个异常将是实际异常的一个包装器。同样通过使用 try catch,您严重依赖于 Spring 的事务性质(回滚能力),但这不是一个好习惯。
【解决方案2】:

如果您不想要休眠警告,您可以将休眠的日志级别设置为信息。

在你的 application.properties 添加这个:

log4j.logger.org.hibernate=info

在 xml 中:

<logger name="org.hibernate">
  <level value="info"/> 
</logger>

【讨论】:

猜你喜欢
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多