1

我正在使用下面的代码将记录插入数据库,

    EntityManagerFactory emf = getEmf();
    em = emf.createEntityManager();
    //Get the Transaction
    EntityTransaction trx = em.getTransaction();
    trx.begin();
    for ( int i=0;i<10000;i++) {
       //Create new Object and persist
        Customer customer = new Customer(.....);
        em.persist(customer);
        //Once its reach the 1000 size do commit
        if ( i % 1000 == 0 ) { 
            em.flush();
            em.clear();
            trx.commit();
        }
    }
    em.close();

当我在数据库中没有任何重复值(如新客户对象)时,上面的代码工作正常。如果我在数据库中有任何重复的客户值,我会收到“SQLIntegrityConstraintViolationException”。

在这里,我使用persist()将记录插入数据库以解决性能问题。如果我使用合并(),它的工作正常。但它需要更多的时间来完成任务。

在persist() 的情况下,是否有任何选项可以识别哪个是重复记录(即获取重复记录信息)?

如果数据库中存在多个重复记录,是否有任何选项可以识别哪些是重复记录?

4

1 回答 1

0

我相信避免添加重复项是应用程序代码的责任。

您可以保存已发送到 persist() 的客户列表,然后在提交之前,使用 JPQL 查询查询数据库,例如:

SELECT COUNT(c)
FROM Customer c
WHERE c in (:customers)

并将列表发送到客户绑定变量。检查结果,如果计数 > 0,则您知道客户已重复,并将在提交时导致 SQLIntegrityConstraintViolationException。

或者,在使用em.find(customer, Customer.class)持久调用将 em 添加到持久上下文之前使用调用。如果存在,请不要添加它。

于 2012-09-07T13:35:28.107 回答