0

所以我正在用 Sax 解析一个 Xml 文件,我想知道我的数据库中是否已经存在一个实体。我正在使用我的代码@endElement 的 createQuery 部分:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("PU");
        em = factory.createEntityManager();
        em.getTransaction().begin();  
........
    empExisists = em.createQuery("SELECT s FROM Employee s WHERE s.userName=:userName", Employee.class). setParameter("userName", emp.getUserName()).getSingleResult();

我已经在我的应用程序的其他地方使用过这段代码,它运行良好。

现在发生了一些非常奇怪的事情,我收到了 SQLIntegrityConstraintException,因为存在主键违规。

Internal Exception: java.sql.SQLIntegrityConstraintViolationException: Die Anweisung wurde abgebrochen, weil sie in einer für 'EMPLOYEE' definierten Vorgabe für einen eindeutigen oder Primärschlüssel bzw. für einen von 'SQL120805145505950' bezeichneten eindeutigen Index zu einem duplizierten Schlüsselwert geführt hätte.

我真的不知道为什么会出现这个异常,因为我不想在这里保留任何实体。我的持久部分位于 endDocument 中,我在其中捕获了所有 ConstraintViolationExceptions。

4

1 回答 1

0

似乎 java 在尝试执行 em.createQuery 之前总是调用 em.flush() 以保证所有数据都存储在数据库中。

我仍然不知道为什么会出现这个错误,因为我的实体管理器不应该包含任何在调用 em.createQuery 之前将被持久化的 EMPLOYEE 对象。

我现在在发生异常的 em.createQuery 之前使用 em.clear() 的解决方法。因此,我现在总是在使用 em.persist() 之后立即使用 em.fush()。

我认为这不是一个很好的解决方案,所以如果有更好的解决方案,请告诉我

于 2012-08-08T22:43:54.697 回答