我使用下面的代码将记录插入数据库,
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中存在多个重复记录,是否有任何选项可以识别哪些是重复记录?
答案 0 :(得分:0)
我认为避免添加重复项是应用程序代码的责任。
您可以保存已发送给persist()的客户列表,然后在提交之前,使用JPQL查询查询数据库,如:
SELECT COUNT(c)
FROM Customer c
WHERE c in (:customers)
并将列表发送给customers绑定变量。检查结果,如果计数> 0,您知道客户已被复制,并且会在提交时导致SQLIntegrityConstraintViolationException。
或者,在使用持久调用将em添加到持久性上下文之前,使用对em.find(customer, Customer.class)
的调用。如果存在,请不要添加它。