在我的测试JPA项目中,我正在做以下事情:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAExamples");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Article article = em.find(Article.class, 1);
Comment comment = new Comment();
comment.setId(21);
comment.setAuthor("Author21");
comment.setTitle("Title21");
comment.setArticle(article);
em.persist(comment);
em.getTransaction().commit();
em.close();
emf.close();
ID为21的注释已存在于DB(MySQL)中。因此我得到了EntityExistsException。但我关心的是我得到它的路线。我在em.persist()上得到它。 AFAIK,持久化上下文只有在我执行em.getTransaction()。commit()时才会与DB同步。只有当提供程序命中在commit()上发生的DB时,才能实现EntityExistsException。 em.persist()应该只管理Comment对象,即使用持久化上下文注册。那么为什么我在em.persist()上获得异常而不在em.getTransaction()上获得异常.commit()
答案 0 :(得分:0)
阅读EntityManager.persist的javadocs
@throws EntityExistsException if the entity already exists.
(If the entity already exists, the EntityExistsException may
be thrown when the persist operation is invoked, or the
EntityExistsException or another PersistenceException may be
thrown at flush or commit time.)
由实施决定何时进行检查。