2012-01-27 79 views
3

我最近得到了objectify與app引擎的合作,但是我在多次註冊一個對象類時遇到了麻煩。在Eclipse中開發時,每次刷新本地主機時都會重新編譯和運行,註冊該學生的腳本會多次運行,並且只需刷新一次就會崩潰程序。Google App Engine + Objectify:註冊一次對象?

<% 
//In my main.jsp file, which is the main interactive html page 
ObjectifyService.register(Object.class); 
%> 

如何確保此腳本只運行一次?有沒有辦法檢查一個類是否通過物化註冊?我遵循另一個stackoverflow線程上的建議做到以下幾點:

public class Object { 
    ... 
    static { 
     ObjectifyService.register(Object.class); 
    } 
    ... 
} 

這給了我一個不同的錯誤。我該如何解決這個問題?

+0

「崩潰」? 「一個不同的錯誤」?請明確點!包括堆棧跟蹤! – 2012-01-27 04:55:44

回答

1

把它放在你的ServletContextListener,具體而言,在contextInitialized()掛鉤。這將確保Objectify註冊​​碼僅在服務器預熱時執行一次。

+0

這個伎倆,謝謝! – theeggman85 2012-01-27 20:15:21

1

看在這樣一個可靠的例子:

Objectify in JSP

你可以找到類似的嘗試註冊類,但...閱讀從示例註釋:

//請小心這條線!這是一個例子,但是在一個真實世界的項目中,你應該看看一個更好的
//註冊一個實體的位置,建議在應用程序的一開始。

所以......你可能在你實現像幾個方法的Java類:獲取/把/刪除等等,並在Java類,你應該把代碼註冊類

static { 
     ObjectifyService.register(Object.class); 
    } 

OR,尋找那些被在應用程序調用一次,其他一些地方開始

+0

[Objectify文檔](http://code.google.com/p/objectify-appengine/wiki/BestPractices#How_NOT_To_Register_Entities)對此非常明確。 – 2012-01-27 08:46:45

+0

我說要在一個實現了CRUD操作的類中添加靜態塊......所以如果你把靜態塊放在裏面(並且你必須在使用CRUD操作之前創建它的一個實例),它應該沒問題,我沒有說要將靜態塊註冊到「對象」類本身內部 – Daniel 2012-01-27 12:44:55

+1

我很抱歉誤導了一下。我更多地提到一般情況,而不是你的正確建議。你所描述的,註冊到DAO,是一個段落之上我鏈接到一個:http://code.google.com/p/objectify-appengine/wiki/BestPractices#Use_a_DAO – 2012-01-27 12:50:11