【发布时间】:2017-03-29 02:22:41
【问题描述】:
我目前正在使用 Spring boot 1.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);
}
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;
}
getter、setter 和 equalsHashcode.. 是 lombok 注释。
其他:
春季启动: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 exceptions
我已经尝试实现这个问题的答案,不幸的是我的代码从未遇到过 DataAccesException 异常
Does Spring JPA throw an error if save function is unsuccessful?
再次对上述问题做出类似回应。
http://www.baeldung.com/spring-dataIntegrityviolationexception
我尝试将 bean 添加到我的 JPAconfig.java 类中:
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
return new PersistenceExceptionTranslationPostProcessor();
}
但似乎什么也没发生。
抱歉发帖太长,请提前联系
【问题讨论】:
标签: java spring-data spring-data-jpa