这是顺序:
- App1:在 ID=1 的数据库上持久化实体。没问题。
- App2:外部应用程序删除 ID=1 的同一记录。没问题。
- App1:尝试再次持久化之前被App2删除的实体,这里抛出一个异常“IntegrityConstraintViolation”,好像记录还在数据库中,我插入了两次,不是。
事实是,正如我所见,EntityManager 正在使用缓存来验证数据库的完整性。不知何故,即使在我打电话之后
getEM().getEntityManagerFactory().getCache().evictAll(); or
getEM().clear();
EntityManager 以某种方式将该记录保存在缓存中,而我对如何清除该缓存没有任何想法。我发现的一种解决方法是从 App1 调用:
getEM().remove(entity.class, id);
它还有效地从数据库和 EntityManager 缓存中删除了记录。但是,这不是重点,它只是证明它正在使用缓存进行验证,但主要问题仍然存在,“从另一个应用程序中删除后,我无法再次持久化记录”。
顺便说一句,我也尝试刷新实体,但也不起作用。它抛出一个异常,说该实体不受管理。
有人对如何解决这个问题有任何想法吗?