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

延迟插入与JPA,Spring orm,Hibernate

宇文嘉勋
2023-03-14

好的,对于前面提到的技术,这是一个非常奇怪的行为,我有一个控制器,它调用一个服务,这调用一个dao。传递给持久化的实体有一个带有注释的字段@Column nullable=false,unique=true,当我为dao或服务运行测试并插入重复值时,会抛出异常org。springframework。刀。DataIntegrityViolationException这是正常的,是预期的行为。但是,当我运行web应用程序时,异常会在服务完成执行后抛出。在执行dao时不会。因此,这迫使我在控制器中捕获异常,而不是在服务中。

    控制器启动
  1. 服务//继续
  2. DAO//继续(但是此时应该抛出异常)
  3. 服务//完成(一个尝试接球围绕着道,但没有异常抛出)。
  4. 控制器//异常被抛出。

我在每个方法中都添加了一些日志,以便可以看到

插入到。。。

语句在服务调用完成后执行。

非常感谢。

编辑

这是xml事务定义。

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>

        <tx:method name="crea*" propagation="REQUIRED"/>
        <tx:method name="obtener*" propagation="SUPPORTS" read-only="true" isolation="DEFAULT"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut expression="execution(* com.company.service..*.*(..))"
        id="txPointcut" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>

这是两段代码,第一段是捕获异常。

package com.company.service.tarea.ventas.impl

    public Producto obtenerSiExisteDuplicadaClave(String clave) {

        try{
            return productoService.buscarPorClave(clave);
        }catch(EmptyResultDataAccessException e){
            log.error(e.getMensaje());
        }

        return null;
    }

此代码不起作用

com.company.service.tarea.almacenpt.impl

    public void creaEntradaProduccion(Entrada entrada, BindingResult bindingResult) {
        if(log.isDebugEnabled())log.debug("creaEntradaProduccion");


            entradaService.peristeEntrada(entrada);

        if(log.isDebugEnabled())log.debug("persistido...");
    }

抛出异常,直到代码执行完毕并将执行返回给控制器,它到达日志“persistido”。

共有2个答案

拓拔富
2023-03-14

@OJVM:您正在捕获一个特定的异常。这是相同的例外,这是转义您的try/catkBlock。要标识相同的,请放置一个通用异常块。记录它。一旦确定了逃离此块的特定异常,请将其添加到此处。

前任:

package com.company.service.tarea.ventas.impl

public Producto obtenerSiExisteDuplicadaClave(String clave) {

    try{
        return productoService.buscarPorClave(clave);
    }catch(EmptyResultDataAccessException e){
        log.error(e.getMensaje());
    }catch(Exception e){
        log.error(e.getMensaje()); // e.getMessage() ; // Once caught put handle this exception also specifically
    }
    return null;
}
逄皓轩
2023-03-14

这是意料之中的。持久化en实体仅将其关联到持久化上下文。异常将在执行插入语句时引发,并且在刷新持久性上下文时执行语句(这将在执行查询之前或提交事务之前自动发生)。

您的测试可能是有效的,因为测试中的事务是在DAO调用时启动的,并在DAO调用后立即提交。而在生产环境中,DAO调用是作为现有事务的一部分进行的,在调用服务时启动,在服务方法返回时提交。

 类似资料:
  • 问题内容: 我在JPA实体中的延迟加载属性有问题。我读过许多类似的问题,但它们与spring或hibernate有关,并且他们的后代不适用或没有帮助。 该应用程序是在Wildfly应用程序服务器上运行的JEE和JPA2.1。有两个实体,DAO会话bean和servlet将它们放在一起: 当我运行此代码时,它失败并显示: 我对WebLogic / JPA1使用了非常相似的模式,并且运行平稳。任何的想

  • 我试图在草图。我尝试了,但我想它不会工作,因为在Java中,它会阻止绘制图形。 基本上,我必须画一个三角形,在画三条边时会有延迟。 我该怎么做呢?

  • 我最近开始学习C++,以前我是用围棋编程的。 我最近被告知不应该使用,因为抛出的异常可能会导致分配的内存不是D并导致内存泄漏。一个流行的解决方案是RAII,我找到了一个很好的解释为什么要使用RAII以及它在这里是什么。 然而,从Go开始,整个RAII的事情似乎是不必要的复杂。Go有一个叫做defer的东西,它以一种非常直观的方式解决了这个问题。您只需将作用域结束时要执行的操作包装在中,例如或,它将

  • 看了几个网页后,我仍然不明白为什么我的@ElementCollection会急切地加载。我的理解是,默认情况下任何@ElementCollection都应该总是懒洋洋地加载。正如您所看到的,情况并非如此--您将在本文末尾看到控制台的输出。我试图使用@ElementCollection(fetch=fetchType.lazy)注释强制执行惰性加载,但这并没有改变任何事情。有没有人可以解释一下,也可

  • 我现在被IFPH第7章的一个问题困住了。 练习7.1.2内容如下: “排序的一个定义是取 详细给出表达式排序[3,4,2,1]的渴望和懒惰求值减少序列,解释它们的区别。” 现在,我先从急切的求值缩减序列开始,我假设它是最内部的缩减。 对我来说,这产生了... 这是已排序的列表。 现在对于惰性评估,我能想到的唯一减少序列与渴望评估完全相同。当然,Haskell对惰性评估进行最左边的最外层评估:但是我

  • 问题内容: 我以这样一种方式进行了JPA设置:如果我不使用延迟加载,则几乎将加载整个数据库。我也直接在模型上使用序列化,因此有时我需要初始化代理。 我只想在集合上使用延迟加载。急切地获取一些奇异实体的事实就很好了。但是,无论我如何尝试设置集合,我都永远不会得到代理集合,而我总是会得到完全加载的集合。 这是一些示例代码: 所以这里的问题是,当我检查调试器时,答复的persistantBag-list