失败的保存尝试(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
答案 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将在该呼叫后得到管理)。