2010-07-13 86 views
3

我是JSF的新手,想知道我是否正確。比方說,我有一個簡單的CMS,可以編寫頁面。如何通過JSF和JPA避免模型代碼重複

首先,我定義了一個稱爲頁JPA實體:

@Entity 
public class Page { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column 
    private Long id; 

    @Column private String title; 

    @Column private String content; 

    // getters & setters ... 

} 

然後,我想在一個視圖中創建頁面-S。爲此,它看起來像我需要某種頁面bean。現在我處理這樣的事情:

@Model 
public class PageBean { 

    private Page page = new Page(); 

    public String getTitle() { 
     return page.getTitle(); 
    } 

    public void setTitle(String title) { 
     page.setTitle(title); 
    } 

    // rest of properties & getters & setters ... 

    public void save() { 
     // persist using EntityManager 
    } 
} 

我的問題是下面的一個:因爲我的JPA實體模型,我想在視圖中使用該模型是大部分時間完全一樣,有沒有避免必須在PageBean中創建一批getter & setter?

我在某處讀過你不應該使用與JPA實體和JSF模型bean相同的bean(因爲JSF會對可能影響JPA的getter重複調用),但我不知道是否沒有簡單的方法可以幫助避免這種代碼重複。特別是當你有一個大型模型的應用程序,並且在很多情況下,在視圖bean中不需要任何特殊的東西時,看起來這樣會變得非常麻煩。

回答

4

[...]鑑於我的JPA實體模型和我想在視圖中使用的模型大部分時間完全一樣,是否有避免必須創建一批getter的方法PageBean中的& setter?

我沒有看到使用包裝圍繞實體並加入該層的點確實是重複。只需使用JSF頁面中的實體即可。是的,這引入了視圖和域之間的某種耦合,但通常修改數據庫通常意味着在視圖上添加或刪除字段。換句話說,我不會購買「去耦合」的論點,並且我寫了足夠多的圖層,映射代碼,樣板代碼等,以便儘可能使用簡單的方法。

我讀的地方,你不應該使用相同的bean作爲JPA實體和JSF模型bean(JSF因爲不重複調用的getter可能影響JPA)

我有興趣,如果你可以提供引用,但包裝類(將實體委託給實體)不會在任何地方出現問題時改變任何內容。

以防萬一,一些額外的資源:

2

這不是代碼重複。沒有算法重複。業務邏輯仍然在一個地方。

你的bean正在做什麼只是將視圖連接到域模型。這很好,它是MVC模式的一部分。

如果您使用JPA實體作爲支持bean,那麼您將打破MVC模式。例如,如果有一天,而不是顯示一個普通的String,那麼您需要將Date添加到String,因爲視圖需要(即接口要求),您是否要在JPA類中編寫此視圖邏輯?這沒有意義,混合領域模型和視圖模型。

另一方面,爲什麼該視圖必須知道該域如何實現?如果域值格式更改會怎樣? (例如,出於性能原因,您在de Database中保存時間戳String而不是日期類)。所有你需要做的只是重寫支持bean中的方法,它會佔用時間戳並將其調整到日期,以便一切都可以像以前一樣工作。只是在JPA類之外進行一次更改。如果你在JPA類中擁有它,你最終將只在一個類中保持邏輯(接口邏輯和域邏輯)。

如果你想開發一個新視圖(例如移動版本),該怎麼辦?你會添加更多的代碼到JPA類嗎?最好讓JPA保持原樣併爲移動版本創建另一個Bean(爲這兩個視圖擴展一個公共bean)。

如果這一切後,你仍然想不寫getter和setter,你可以做

#{myBean.page.title} 

所有你需要的是支持bean裏面getPage()

+0

的'#{myBean.page.title}'正是他需要的,就已經足夠作爲整個答案的擁有。大多數JSF/EL-starters沒有意識到「深度鏈接」getter的能力,因此認爲有必要將管理bean中的實體展平/錘擊。 – BalusC 2010-07-13 11:35:59

+0

我知道他從開始想要什麼。但是我認爲,一旦你意識到自己在做什麼以及它的影響,你就應該能夠深入鏈接。這就是爲什麼我在回答之前寫下「免責聲明」部分的原因。我在後臺bean中使用了很多深層鏈接,但是當涉及到訪問域模型中的字段時,我會考慮兩次。 – pakore 2010-07-13 11:47:08