JPA:使用persist()批量插入问题

时间:2012-09-07 09:55:56

标签: jpa

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

    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();

当我在数据库中没有任何重复值时,上面的代码工作正常,就像新的Customer对象一样。如果我在数据库中有Customer的任何重复值,我将收到“SQLIntegrityConstraintViolationException”。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

并将列表发送给customers绑定变量。检查结果,如果计数> 0,您知道客户已被复制,并且会在提交时导致SQLIntegrityConstraintViolationException。

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