2011-11-16 48 views
0

我的豆腐看起來像這樣:物化+ JSP:顯示1:N的關係

@Entity 
public class Fattura { 

    @Id 
    Long id; 

    @NotEmpty 
    String numero; 

    @Min(value=0) 
    Double importo; 

    Key<User> utente; 

    // gets & sets.... 
} 

的「utente」屬性是另外一個bean我創建的關鍵:一個「Fattura」只能有一個「用戶」 ,一個「用戶」可以有很多「Fattura」 S

我的Spring MVC的控制器將管理一個請求Fattura的列表,並在一個簡單的JSP顯示出來:

@RequestMapping(value = "/fatture" , method = RequestMethod.GET) 
    public ModelAndView leFatture() { 

     ModelAndView mav = new ModelAndView("fatture"); 


     mav.addObject("fatture",fatturaService.listFatture()); 

     return mav; 
    } 

的JSP代碼非常簡單:僅在表中一個foreach循環

我的問題是:

我怎麼能顯示「utente」?

我唯一的一點是它的關鍵,但我想這樣做$ {} fattura.utente.firstName在我JSP,我該怎麼辦呢?

回答

1

不幸的是,你將不得不在你的DAO類中手動獲取「utente」。 Objectify中沒有像Twig那樣的自動獲取。在我的POJO我有以下領域

@Transient private Organization sender;    // Pickup location (for client RPC) 
transient private Key<Organization> senderKey;  // Pickup location (for Datastore) 

我從數據存儲加載實體,然後手動組織使用senderKey加載。

在新Objectify4,你就可以做你想做的是這樣的:

class Beastie { 
    @Parent 
    @Load 
    ParentThing parent; 

    @Id Long id; 

    @Load({"bigGroup", "smallGroup"}) 
    SomeThing some; 

    @Load("bigGroup") 
    List<OtherThing> others; 

    @Load 
    Ref<OtherThing> refToOtherThing; 

    Ref<OtherThing> anotherRef; // this one is never fetched automatically 
} 

Here是不斷變化的新版本的設計文件。

2011年11月17日更新:這是個大新聞。 Twig作者約翰帕特森今天加入Objectify項目。

+0

我懷疑這樣的事情......所以我必須保持重複屬性爲每個鍵的關係?這不太好!你建議我使用Twig還​​是JDO/JPA? –

+1

我通過鏈接到Objectify4 doc更新了我的答案。我在一個月前有過確切的想法,法比奧。我最終選擇了Objectify,因爲我的項目會在很大的負載下工作,並且我希望有一個乾淨的簡單代碼,讓我瞭解所發生的一切。我正在考慮Twig,但最近似乎項目得不到支持。根據JPA我喜歡它,但因爲數據存儲不是RDBMS GAE的JPA實現有許多奇怪的限制,而且它會對數據存儲進行大量冗餘調用,這會花費您真正的資金。 – expert

+0

很棒的回答!我想知道新的@Load將如何適合我的「客戶 - 發票」用例,但我相信會有出色的文檔。我也從使用JDE和GAE的恐怖評論中看到了Objectify。你知道Objectify是否會得到很長時間的支持(我未來的項目需要一些嚴格的可靠性)? –

1

我知道這聽起來很煩人,您必須手動獲取這兩個對象,但它確實是非常有用的知道你的工作量增加了一倍,並且時間這麼做 - 每個「獲取」調用需要一段時間,第二個在第一次完成之前不會開始。它是一個典型的NoSQL環境,你不應該經常需要有兩個獨立的實體 - 你有這樣一個原因嗎?

只有兩個原因,我可以很容易地想到:

  1. 類引用同類型的另一個對象 - 這是物化的文件,其中一個人有自己的配偶參考的例子,誰也是一個人。

  2. 您將另一個嵌入到其中的類(您的案例中的「Fattura」)中有大量數據,您不想在同一時間獲取「用戶」而且您需要的用戶比自己需要的「Fattura」和「User」更頻繁。當你需要「Fattura」時,需要有相當多的數據值得額外的數據存儲庫調用。

+0

我無法理解你的答案100%....「它是一個典型的NoSQL環境,你不應該經常需要有兩個獨立的實體」......但是我確實需要像使用RDBMS一樣使用數據存儲,不幸的是,所以我想要做的只是一個簡單的手動「加入」。你如何在objectify-gae中編寫一個簡單的一對多關係?考慮一下像OFFICE這樣的基本案例(1)=> PERSON(MANY) –

+0

「這是一個典型的NoSQL環境,你不應該經常需要有兩個獨立的實體 - 你有這樣一個原因嗎?」你能簡單地向我解釋一下嗎? –

+0

對不起,我原以爲你試圖代表一對一的關係,這通常不是必需的。如果你想展示一對多,這取決於你如何使用它最好。例如,您可以使用office對象上的列表列出辦公室中的所有用戶。你最常用的是什麼?您是否更經常地尋找用戶所屬的辦公室或尋找辦公室中的用戶列表? – mjaggard

-1

您不一定非得使用臨時字段來獲取對象。

這工作:

public User getUtente() { 
    Objectify ofy = ObjectifyService.begin(); 
    return ofy.get(utenteKey); 
} 

這當然會做一個數據存儲的get()每次調用getter時。您可以通過在您的用戶實體上使用@Cached來改善這一點,以便在第一次調用後它們變爲memcache調用。內存緩存是好的,但我們可以使用會話緩存做一個好一點:

public User getUtente() { 
    Objectify ofy = myOfyProvider.get(); 
    return ofy.get(utenteKey); 
} 

這裏的關鍵是,你需要提供(通過myOfyProvider)綁定到當前的請求/線程客觀化的一個實例並且啓用了會話緩存。 (即,對於任何給定的請求,myOfyProvider.get()應返回Objectify的相同實例)

在此設置中,每次調用getter時,會從會話緩存中返回完全相同的User實例;從該實體的初始加載之後,不會對數據存儲/ memcache發出任何請求。

+0

我已經明白:但我不希望我的實體POJO綁定/耦合到持久層! –