2011-09-05 27 views
3

在去年,簡化這個組合的過程中有沒有新的發展,或者它基本上和以前一樣?如何簡化Spring/Hibernate組合而不需要Roo

我不太喜歡很多新的RAD框架/平臺(Rails等)。我認爲它們適用於小應用程序或概念驗證......但是當我轉向複雜的需求時,我通常很快就會對它們的缺點感到惱火。特別是Rails有很多問題 - 令人吃驚的是,這太多太多,實際上比我在Java中需要花費的時間減少了很多......我認爲大多數人永遠不會遇到的事......或者可能永遠不會碰到他們的蜜月期結束了。

在很多情況下,我寧願擁有Spring/Java的強大功能和可靠性,即使這意味着開發應用程序需要更長的時間。我對此感到滿意。我相信它。我知道如何部署它。它可以工作,並且適用於大型應用程序。

我真的很想盡可能地改善我的開發經驗。我正在尋找人們通常喜歡在Spring/Hibernate項目中使用大型web 2.0(ria)類型的項目(或者Spring /不管怎麼樣,我猜...)。

  1. 我相當確信dbunit已經過時了,並且是我測試性能問題的一個重要來源。有沒有類似的工廠女孩​​,但對於Java?

  2. 有什麼辦法可以使鏈接更「像應用程序」,而不是隻是鬆散的字符串?我傾向於重構網址,並手動測試應用程序以確保沒有任何中斷,這是一大痛苦。我會很感激任何解決方案。我目前使用Freemarker/Spring MVC。

  3. 我發現我需要在我的應用程序中使用越來越多的AJAX。簡單的ajax很好,但是現在我必須使用Jackson在傳入Spring MVC控制器之前解析傳入的請求JSON。很多這種解析/映射非常耗時。一定有更好的方法。在那兒?我不想爲接收到的JSON請求的解析器​​/對象映射器再次編程到我的控制器層。

  4. 我在Rails中真正喜歡的一件事是將查詢拼湊在一起並具有可重用的查詢片段的能力。我忘記了他們所稱的他們。有沒有辦法使用Hibernate/Spring來做到這一點?我有很多使用大量HQL字符串的查詢,並且很多時候,這些查詢的各個部分在整個應用程序中一遍又一遍地重複。我想在這裏重複使用我能做的。可以做到嗎?

  5. 當我部署時,通常會遇到太多的小問題,這些問題在測試時不會被捕獲。 Hibernate代理錯誤和奇怪的延遲加載問題位於此列表的首位,但即使是Spring MVC控制器的註解問題以及其他各種問題也會出現,這些問題很難測試(或者可能無法測試?)。這些問題有哪些解決方案?不使用Hibernate?做一些其他類型的測試?什麼工作?我不介意做測試,但我希望測試速度很快,否則我可能會變得更加嚴重,並會拒絕這樣做。

  6. 一般來說,其他任何你認爲有助於提高生產力的方法,我可能從未聽說過。不幸的是,我在Java領域一直沒有太活躍,所以我落後了。我需要一點「這是現在可用的」類型的建議。

謝謝!

+0

是不是與Jackson的對象映射一個班輪(在你創建你的數據模型後)? – Kevin

+0

@Kevin:不,因爲傳入的json可能會引用對象標識符,您需要將其從數據庫中提取出來(即映射)。這要求您爲傳入的json請求定義一個自定義分析器/映射器。我承認,對於簡單的東西,默認設置(主要)工作,但對於複雜的東西,你需要投入大量的工作。 – egervari

回答

0

我只能回答我瞭解的...

2.我們已經做了這樣的事情在我們的自定義標籤庫的應用程序,但是,如果你使用的是明明只有有用JSTL。您是否考慮創建一個包含所有網址的類作爲靜態最終字符串,然後將該類添加到Freemarker中作爲shared variable? Spring MVC中的@RequestMapping註釋應該能夠引用那些相同的靜態最終字符串。

3.我推薦Direct Web Remoting - 它在服務器和客戶端都自動處理AJAX調用。一旦設置完成,只需要註釋要從Javascript代碼中調用的Java方法,然後DWR就會生成使用這些調用的Javascript代碼,並將返回值轉換爲Javascript對象。 DWR一段時間沒有積極發展,但我發現它非常穩定可靠。

5.對於Hibernate延遲加載,我們只需啓用Spring的org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor,它可以爲整個Web請求保持打開一個會話。它消除了延遲加載錯誤,並使Hibernate的行爲更易於理解(即因爲您始終處於會話中,所有更新都被提交給數據庫)。如果你打算這樣做,那就在開發開始時進行......否則現有的代碼可能會被破壞,因爲如果它假定會話已關閉。

6.如果您的網站是比網站更多的網絡應用程序,請考慮使用Vaadin來構建它。它是一個基於GWT構建的開源RIA框架,我們在Spring和Hibernate中非常成功地使用它。我們將Vaadin用於「類似於應用程序」的部分,如管理工具,以及Spring MVC/JSTL用於「類似網頁」的部分,如面向公衆的頁面;兩者都使用相同的Spring/Hibernate業務層構建到同一個WAR中。

+0

感謝您的回覆。我實際上使用OpenSessionInViewInterceptor,但它不會一直工作。例如,會話中的任何對象引用都將丟失,例如與當前用戶關聯的對象。這是相當具有欺騙性的,你可以調用它們的指針,但它們會失敗,因爲休眠會話在幾次頁面請求之後很久就消失了。我會研究DWR/Vaadin。我總是謹慎地添加新的大型工具/框架「上面」。我會看到增加的複雜性是否因易於開發而得到補償。有時情況並非如此,所以我必須看到。 – egervari

+0

我遇到的最煩人的事情是休眠。有時一個'多對一'關係被設置爲懶惰,並且它確實需要懶惰......但是,拉出父對象然後先搶先初始化惰性實例仍會加載一個愚蠢的java輔助對象。這個對象在Spring MVC中通常不起作用。例如,即使規則設置正確,驗證也不起作用。而且,由IDEA生成的equals/hashcode與Hibernate有趣的行爲。我確信有一個合理的解釋,爲什麼它不工作,但我寧願不必擔心這個垃圾 – egervari

+0

我假設'在會話中的對象引用',你的意思是存儲數據對象在應用程序服務器'HttpSession'而不是Hibernate會話。我認爲這是一個可怕的想法,原因如下: (1)關於記錄你不再有單一的真相來源...... HttpSession中的一個是正確的還是Hibernate中正確的一個?(2)應用程序服務器必須將會話數據保存在內存中,通常會嚴重限制可以使用的活動用戶數量(3)您按照所述延遲加載異常。 - 我建議只在HttpSession中存儲ID,將所有數據保存在Hibernate中。 – gutch