2015-11-30 95 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)的應用程序。