2015-11-30 49 views
0

我使用hibernate-jpa-2.1-api。我需要一些功能。插入时如何忽略dublicate行

我每分钟解析一个文件并将数据插入MSSQL DB。我需要跳过重复的行。例如在12:00我已经在我的文件300行。我解析每一个并插入300行。一分钟后(12:01)我的文件包含500行。我解析它,我想只插入200行而不是旧的300行。

在程序的旧实现中,我使用了SQL插入并且没有使用ORM。

这里是我的老SQL查询:

insert /*+ ignore_row_on_dupkey_index(avaya_cm_cdr, i_avaya_cm_cdr_nodub) */ into avaya_cm_cdr(acmcdr_id, cdrdate, cdrtime, secdur, condcode, attdconsole, codeused, outcrtid, codedial, dialednum, intrkcode, incrtid, callingnum, vdn, bcc, ppm, acctcode, authcode) values(seq_acmcdr_id.nextval, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

这是我的新的插入与ORM:

em = Persistence.createEntityManagerFactory("COLIBRI").createEntityManager(); 
public void insertAVAYAcmCDRs(List<AvayaCmCdr> cdrList) { 
    em.getTransaction().begin(); 
    for (AvayaCmCdr aCdrList : cdrList) { 
     em.persist(aCdrList); 
    } 
    em.getTransaction().commit(); 
} 

我如何使用模拟功能ignore_row_on_dupkey_index与ORM?

p.s.在旧的实现中,我使用了Oracle DB。

+0

你刚刚得到的(俄语)答案有什么问题[这里](http://ru.stackoverflow.com/questions/470631/Аналог-функции-ignore-row-on-dupkey-index-в- mssqlили-ОРМ眠)? –

回答

0

数据库样式选项

Hibernate本身不提供一个选项添加到其insert into语句。我不知道MS SQL是否有相同的选项。

但是,如果你找到这样的选项,你可以拦截insert语句,并添加自己:

public class IgnoreRowOnDupInterceptor extends EmptyInterceptor { 

    public String onPrepareStatement(String sql) { 
    if (sql.startsWith("insert into avaya_cm_cdr") { 
     return sql.replace("insert into", 
     "insert /*+ ignore_row_on_dupkey_index(avaya_cm_cdr, i_avaya_cm_cdr_nodub) */ into"); 
    } 
    return sql; 
    } 

} 

你需要在你的persistence.xml宣布这个拦截:

<property name="hibernate.ejb.interceptor" value="...IgnoreRowOnDupInterceptor" /> 

JPA风格选项

你可能还记得最后分析的最后一行(或从DAT检索基地),并跳过该文件,直到该行。在这种情况下,您甚至可以节省时间来一次又一次解析每个现有项目。

从我的角度来看,这是JPA的方法,因为您通常使用的数据库只是存储和保持业务逻辑的(Java)的应用程序。