抛出ConstraintViolationException时,为什么JPA实体被Spring Data JPA赋予id(bean验证)

时间:2015-03-18 18:03:01

标签: java spring spring-mvc jpa

失败的保存尝试(EntityManager持续存在)会使我的实体留下ID。

在我的情况下,我将返回视图,其中任何ConstraintViolationException与原始实体一起被抛出为错误消息。视图检查实体是否具有要包含在提交事件时使用的表单操作URL中的ID。然后控制器尝试通过id加载实体。

当我的Spring MVC操作方法在新的未保存事件上运行此代码时:

eventRepository.save(event);

并抛出异常(由ConstraintViolationException引起)Spring中的事件实体org.springframework.ui.Model 现在包含id!为什么?

来自Spring Data JPA&{39} EventRepository的{​​{1}}使用过的代码:

JpaRepository

这是public interface EventRepository extends JpaRepository<Event, Long> {} 实体bean的片段:

Event

1 个答案:

答案 0 :(得分:0)

您可以在here所述的JPA规范中找到事务回滚的行为。想象一下,你在同一个交易中做了两个操作:

//begin transaction
em.persist(entity1);
em.merge(entity2);//here is thrown an exception
//commit transaction

在此示例中,它与JPA兼容,您在entity1中获取ID,因为在事务回滚时,即在调用merge()时,entity1具有ID。另请注意,根据JPA,PersistentContext可能仍处于不一致状态。 另请检查the diffference between perist() and merge()(持久性不返回任何内容,因为实体1将在该呼叫后得到管理)。