使用em.createQuery时java.sql.SQLIntegrityConstraintViolationException

时间:2012-08-06 16:50:02

标签: sql xml java-ee sax

所以我正在使用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.

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

1 个答案:

答案 0 :(得分:0)

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

我仍然不知道为什么会出现这种错误,因为我的实体经理不应该在调用em.createQuery之前保留任何持久化的EMPLOYEE对象。

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

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