我目前正在使用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();
}
但似乎什么也没发生。
抱歉,提前发了这么长的邮件
我想您已经知道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。