当前位置: 首页 > 面试题库 >

Spring JpaRepositroy.save()在重复保存时似乎未引发异常

邴兴为
2023-03-14
问题内容

我目前在Spring Boot 1.4.2上玩耍,在其中我已经加入了Spring-boot-starter-web和Spring-boot-starter-
jpa。

我的主要问题是,当我保存一个新实体时,它可以正常工作(非常酷)。

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

进行以下设置:

应用程序

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

ProductRepository.java

@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());
        }
    }
}

最后是Product.java

@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;
}

吸气,setter和equalsHashcode ..是龙目岛的注解。

杂:

春季靴子:1.4.2

休眠ORM:5.2.2.FINAL

无论我是否对控制器进行注释,都会发生此问题 @Transactional

基础数据库清楚地显示了异常

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

我知道最好将数据访问内容分解为自己的服务层,而不是将其转储到控制器中

控制器的语义不是ReST

我尝试过的事情:

Spring CrudRepository异常

我尝试实现此问题的答案,不幸的是,我的代码从未遇到过DataAccesException异常

如果保存功能失败,Spring
JPA是否会引发错误?

再次对以上问题做出类似回应。

http://www.baeldung.com/spring-
dataIntegrityviolationexception

我尝试将Bean添加到我的JPAconfig.java类中:

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

但是似乎什么也没发生。

很抱歉,请提前联系


问题答案:

我认为您知道
CrudRepository.save()用于插入和更新。如果ID不存在,则将其视为插入;如果ID不存在,则将其视为更新。如果将Id发送为null,则可能会获得异常。

由于除了变量@Id上没有其他注释外id,唯一ID生成必须由代码处理,否则您将需要使用@GeneratedValue注释。



 类似资料:
  • 我目前正在使用Spring Boot1.4.2,我在其中加入了Spring-boot-starter-web和spring-boot-starter-jpa。 我的主要问题是,当我保存一个新的实体时,它工作得很好(一切都很酷)。 但是,如果我用相同的id保存一个新的产品实体(例如重复的条目),它不会抛出异常。我期待的是ConstrintViolationException或类似的东西。 考虑到以下

  • 我试图等到元素出现后再继续,但是对于我当前使用的方法,它的抛出元素不存在,甚至在超时结束之前。 示例用法: 然后它应该等待30秒或直到元素存在,但它会立即抛出元素未找到异常...

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

  • 所以我有两个关于java的一般问题。第一个问题是,什么时候在方法体中使用try/catch,而不是在声明方法时使用throws异常?这是我的意思的一个小例子。这是: 对抗 然后我的第二个问题是什么时候知道捕获或抛出什么类型的异常?我指的是诸如IOException或EOFException等异常... 如果有一个好的链接,有人可以发给我教这一切(这可能比我想象的更复杂),我会像你回答它一样感激。谢

  • 当我认为我已经做了所有正确的事情时,Mockito似乎抛出了一个。这是我的部分测试案例: 下面是分部类和方法: 忽略了一个事实,即您永远不应该模拟您不拥有的接口,为什么Mockito会给我以下消息?

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