簡體   English   中英

覆蓋Google App Engine- Java中的數據存儲區實體

[英]Overwrite Datastore entities in Google App Engine- Java

我有一個要覆蓋單個實體的應用程序。 這是我最初創建實體日志的方式:

Entity log = new Entity("Log", "Logkey");
    String property1 = req.getParameter("property1");
    String property2 = req.getParameter("property2");
    log.setProperty("property1", property1);
    log.setProperty("property2", property2);
    datastore.put(log);

以下是檢索實體日志以進行覆蓋的方法:

Query query = new Query("Log", "Logkey")
             .setFilter(timeStampFilter);
List<Entity> logs = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(1));  
request.setAttribute("logs", logs);

並以value="${log.properties.property1}"形式發送到jsp表單頁面,該頁面應被覆蓋。 然后,使用POST方法將該條目發送到第二個servlet,並像前面的代碼中一樣將其作為參數進行請求,但保存為具有相同種類的新實體:

Entity edit_log = new Entity("Log", "Logkey");
        String property1 = req.getParameter("property1");
        String property2 = req.getParameter("property2");
        edit_log.setProperty("property1", property1);

對於重寫和現有實體,在通過時間戳檢索特定日志之后,可以使用getKey()方法獲取此日志的鍵,然后使用該鍵和新的詳細信息創建一個實體。 現在,當您將此新實體放入數據存儲區時,它將用相同的密鑰替換較早的實體

使用您編寫的代碼,您的數據存儲區中只有一個Log實體,並且鍵“ Logkey”不斷被覆蓋。

如果您使用其他代碼來檢索實體並重寫它們,則需要顯示其他代碼。 否則,由於給出的代碼已經在描述您要執行的操作(總是覆蓋相同的實體),因此該問題的編寫效果很差。

如果您在其他地方有創建/保存實體的代碼,則最好也進行說明。

編輯 :看起來您最終用相同的鍵在新實體中用舊實體中的數據創建了一個嵌套實體。 重用您從查詢中收到的實體要容易得多。

log = logs.get(0)
log.setProperty("property1", req.getParameter("property1");
log.setProperty("property2", req.getParameter("property2");
datastore.put(log);

此外,由於您實際上知道鍵(“ Logkey”),因此不需要發出數據存儲查詢,您只需按鍵就可以獲取實體-這很好,因為您可以避免最終的一致性行為。

如果新實體的密鑰與原始實體的密鑰相同,則在存儲它時它將覆蓋舊實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM