当前位置: 首页 > 知识库问答 >
问题:

无法捕获由约束违反引起的Hibernate异常

卢鸿彩
2023-03-14

我已经研究了许多其他关于不捕捉异常的问题(包括不能捕捉约束违反异常),但没有一个问题和我一样。

使用RestEasy联网和Hibernate链接Postgres db。

我有一个目标:

@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"user_id"})})
public class Outcome {

    @Id
    @GeneratedValue
    private Long id;

    @OneToOne
    private User user;

    private String anotherAttribute;
}

db服务通过OutcomResource.save输出发送一个输出:

@POST
@Consumes("application/json")
@Transactional
public Response saveOutcome(Outcome outcome){
    try {
        myRepository.save(outcome);
        return Response.ok().build();
    } catch (Exception e) {
        System.out.println("I caught the exception:" + e);
        return Response.status(Response.Status.BAD_REQUEST).build();
    }
}

然后由OutcomRepository.save保存在db中:

public void save(Outcome outcome) {
    try {
        getEntityManager().persist(outcome);
    } catch (Exception e) {
        System.out.println("No I caught the exception : " + e);
    }
}

当为用户发布并保存第一个结果时,它成功地保存在数据库中。如果发布了第二个结果,则会像预期的那样抛出一个错误。

缩短的错误堆栈跟踪是:

javax.persistence.RollbackException: 
   Error while committing the transaction
   Description: The server encountered an unexpected condition that
   prevented it from fulfilling the request.
   Exception: org.jboss.resteasy.spi.UnhandledException:
   javax.persistence.RollbackException: Error while committing the transaction
org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:78)...
Root cause: javax.persistence.RollbackException: 
    Error while committing the transaction...
Root cause: javax.persistence.PersistenceException:
    org.hibernate.exception.ConstraintViolationException: 
    could not execute statement...
Root cause: org.hibernate.exception.ConstraintViolationException: 
    could not execute statement...
Root cause: postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint
    Detail: Key (user_id)=(361) already exists.

我希望捕获此错误以返回错误的请求-响应。尽管尝试捕获堆栈跟踪中的通用异常和每种特定类型的异常,但两个捕获块都没有输入。

为什么两个方法都不能捕获异常,以及如何能够捕获异常?

共有1个答案

屠瑞
2023-03-14

几个小时的研究后,我发现...

无法捕获异常,因为它是在方法完成后引发的。这是因为服务层方法被标记为@Transactional,所以hibernate在该事务结束之前不会抛出异常。

如果使用spring:编写一个转换异常的后抛出建议,显然会允许您处理这个问题,但是我还没有测试过。

我还没有找到在Guice中处理此异常的方法,因此将不处理它。这在我的情况下是可以的。

良好的信息来源:http://forum.spring.io/forum/spring-projects/data/68995-transaction-manager-appears-to-be-eating-the-runtime-exception

 类似资料:
  • 我正在使用Spring和Hibernate,我得到了这个例外。以下是我试图获得的:我有User和UserSettings类,它们以OneToMany和ManyToOne注释为界,如下所示: 现在,我想为用户添加设置,我是这样做的: 问题来了:UserSettings中的用户持有旧设置和新设置的集合(设置,我刚刚创建并想要添加),但旧设置持有用户的集合,其中没有新设置。我想这就是为什么我会遇到异常,

  • 我有一个MathematicsAnswer引用的实体数学。如果对数学执行post请求,我会得到一个例外,即MathsAnswer上的字段不能为空。但我确实在球场上跳了起来。拜托,我需要这个解决方案<代码>java.sql。SQLIntegrityConstraintViolationException:列'question_id'不能为空。 sql架构: 实体类: MathsAnswers.jav

  • 问题内容: 我有以下代码: userDAO1.save(userRecord)违反了完整性约束-因此,在运行了整个代码之后,没有任何内容写入到userDAO1所引用的表中。 但是,userDAO1.save()语句不会引发错误/异常-因此,也会执行userDAO2.save()。 但是捕获了DataIntegrityViolationException,并且 堆栈跟踪为null 。 如何检查从何处

  • 我有两个已经存在于postgres中的表,我们称之为表A和表B。表B的一列有一个外键约束,因为它必须是表A的主键。因此,B和A之间存在多对一的关系,表B中的多条记录对应于表A中的一条记录。 这两个表的实体定义如下。 表B的实体定义如下: 其中userId是映射到表a中的主键user_id的外键。这些约束已经在底层postgres数据库中定义了,所以我没有考虑使用@ManyToOne注释关系(仍然试

  • 我在项目中使用Spring数据,并使用JPA在实体和表之间进行映射,这是我的实体 这是我的回购 当我尝试保存时,我遇到了以下问题:

  • 我在表中的列上添加了唯一约束。当违反约束时,它会抛出一个我无法捕获并传达给用户的异常。 <代码>公开:事务尝试#0失败:java。sql。BatchUpdateException:Batch entry 0 INSERT INTO templates(created\u at,is\u deleted,name,sections)值('2018-10-03 16:31:25.732 05:30',