2013-02-04 70 views
0

我有一個web服務,每天從各種來源獲得大約9GB的原始文本數據。絕大多數這是相對較短(100-300)的字符串,經常重複。我可能只有幾千個獨特的字符串JPA觸發器在值已存在時替換插入的ID

我通常不想預先優化,但我們的存儲問題很快就會成爲開發中的問題。

我有一個JPA實體,並將爲此發佈而簡化。這是一個映射到父表的字符串/ ID對。

@Entity 
public class DeduplicatedString implements Serializable { 


private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
private int id; 


public int getId() { 
    return id; 
} 




public void setId(int id) { 
    this.id = id; 
} 

private String value; 
public DeduplicatedString() { 
    super(); 
} 
public String getValue() { 
    return value; 
} 
public void setValue(String value) { 
    this.value = value; 
} 

}

我想建立一個JPA監聽器(beforeInsert?),以增加新的字符串時,檢查現有的數據,並返回現有記錄,如果精確匹配已經找到。

我通常只是設置一個插入觸發器,我不知道如何在JPA中做到這一點。

謝謝!

回答

1

您需要的功能不是由JPA直接支持的。有一個@PrePersist註釋(與several others一起),但這些只能用於例如監視系統,或對實體進行最後的更改。 JPA不知道在數據庫中執行的任何觸發器,目前還沒有鏈接這兩者的機制。

+0

我可以放入一堆任意SQL,當JPA爲我創建我的表時,這些SQL會運行嗎? – Yablargo

+0

這取決於您使用哪個JPA提供程序?例如,EclipseLink允許您執行此操作:您可以指定您自己的存儲過程或自定義SQL查詢來執行任何CRUD操作。有關更多詳細信息,請參閱此鏈接:http://wiki.eclipse.org/EclipseLink/Examples/JPA/CRUDStoredProcedures – gcvt

0

你指的是什麼意思?你的意思是你不想插入記錄?

通常在您的應用程序中執行此操作,您應該首先使用字符串查詢對象,並且只有在未找到時才保留新對象。

+0

正確。我想要做到這一點。我知道我可以使用插入觸發器或Sproc來查詢並返回現有記錄,或者如果尚不存在,可以添加一個新記錄。我可以使用JPA/JPA聽衆嗎? – Yablargo