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.

ここでエンティティを永続化するつもりはないため、この例外が表示される理由は本当にわかりません。私の持続部分は、すべての ConstraintViolationExceptions をキャッチする endDocument にあります。

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 に答える