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

Spring jparepositroy.save()似乎不会在重复保存时引发异常

公良莫希
2023-03-14

我目前正在使用Spring Boot1.4.2,我在其中加入了Spring-boot-starter-web和spring-boot-starter-jpa。

我的主要问题是,当我保存一个新的实体时,它工作得很好(一切都很酷)。

但是,如果我用相同的id保存一个新的产品实体(例如重复的条目),它不会抛出异常。我期待的是ConstrintViolationException或类似的东西。

考虑到以下设置:

application.java

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
@Repository
public interface ProductRepository extends JpaRepository<Product, String> {}

jpaconfig.java

@Configuration
@EnableJpaRepositories(basePackages = "com.verric.jpa.repository" )
@EntityScan(basePackageClasses ="com.verric.jpa")
@EnableTransactionManagement
public class JpaConfig {

    @Bean
    JpaTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }
}

注jpaconfig.java和application.java在同一个包中。

ProductController.java

@RestController
@RequestMapping(path = "/product")
public class ProductController {

    @Autowired
    ProductRepository productRepository;

    @PostMapping("createProduct")
    public void handle(@RequestBody @Valid CreateProductRequest request) {
        Product product = new Product(request.getId(), request.getName(), request.getPrice(), request.isTaxable());
        try {
            productRepository.save(product);
        } catch (DataAccessException ex) {
            System.out.println(ex.getCause().getMessage());
        }
    }
}
@Entity(name = "product")
@Getter
@Setter
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Product {

    protected Product() { /* jpa constructor*/ }

    @Id
    private String id;

    @Column
    private String name;

    @Column
    private Long price;

    @Column
    private Boolean taxable;
}

Hibernate ORM:5.2.2.final

无论是否使用@transactional注释控制器,都会发生此问题

底层db清楚地显示了异常

2016-11-15 18:03:49 AEDT [40794-1] verric@stuff ERROR:  duplicate key value violates unique constraint "product_pkey"
2016-11-15 18:03:49 AEDT [40794-2] verric@stuff DETAIL:  Key (id)=(test001) already exists

Spring CrudRepository异常

我试着实现了这个问题的答案,不幸的是,我的代码从来没有碰到DataAccessException异常

如果save函数不成功,Spring JPA会抛出错误吗?

   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
      return new PersistenceExceptionTranslationPostProcessor();
   }

但似乎什么也没发生。

抱歉,提前发了这么长的邮件

共有1个答案

公孙弘深
2023-03-14

我想您已经知道crudrepository.save()用于插入和更新。如果一个Id不存在,那么它将被视为插入,如果Id存在,那么它将被视为更新。如果您将Id发送为NULL,则可能会出现异常。

由于在Id变量上除了@Id之外没有任何其他批注,因此唯一的Id生成必须由代码处理,否则需要使用@generatedvalue批注。

 类似资料:
  • 问题内容: 我目前在Spring Boot 1.4.2上玩耍,在其中我已经加入了Spring-boot-starter-web和Spring-boot-starter- jpa。 我的主要问题是,当我保存一个新实体时,它可以正常工作(非常酷)。 但是,如果我用相同的ID(例如重复条目)保存一个新产品实体,则不会引发异常。我期待的是ConstrintViolationException或类似的东西。

  • 问题内容: 我已经坚持了好几个星期,而且我没有最模糊的想法出了什么问题。我已经很浪费了,因为我已经浪费了很多时间 我使用下面描述的数据模型(MySQL)。我已经通过反向工程(Eclipse / JBoss Tools)创建了hbm.xml和java类(请参见下面的示例)。 当我尝试保存推文,单词或事件时,我可以在日志消息中看到生成了pk值并且正确绑定了参数,但是没有任何内容写入数据库。(请参阅帖子

  • 问题内容: 我有以下代码,我希望它抛出,但运行成功。为什么会这样? 问题答案: 的上方法删除指定位置的元素。在开始循环之前,您的列表如下所示: 然后,在列表上启动迭代器: 您的环然后删除 位置1处的元件 ,这是数字2: 在下一个隐式调用上,迭代器返回,然后循环终止。 如果将更多元素添加到列表中,则会得到一个。然后隐式将抛出。 请注意,从Javadoc 到JCF: 注意,迭代器的快速失败行为无法得到

  • 问题内容: 我一直在阅读有关子流程模块的Python文档(请参阅此处),它谈论的命令似乎正是我所需要的。 但是,当我尝试使用它时,出现错误,提示它不存在,并且在运行时未列出。 我正在运行Python 2.6.5,下面使用的代码如下: 有谁知道为什么会这样吗? 问题答案: 它是在2.7的见介绍文档。 如果需要输出,请使用subprocess.Popen:

  • 我希望有人遇到这个问题: 在服务层中,我正在捕获一个异常,在catch块中,我想调用< code>saveAndFlush在数据库中保存一条记录,然后抛出应用程序异常。问题是保存和刷新不能持久保存记录,事务似乎会回滚。 代码是这样的: 有什么想法吗? 非常感谢。

  • 我有一个datatable,并将其导出为JSON格式。datatable的一列是日期列,如2013-01-09 02:18:11.117。