2010-08-11 251 views
3

我正在嘗試學習vaadin。我真的很困惑如何做持久性的任何類型的應用程序開發,因爲如果我有一個對我的服務層對象的引用,他們會存儲在會話中,我真的不希望這樣。持久性內容不可序列化。Vaadin持久性

我的情況是,我有一個使用Spring的應用程序,我正在用它爲Vaadin創建一個新的UI。我可以將spring東西注入到我的Vaadin應用程序中,但它會存儲在會話中。有小費嗎?

順便問一下,您如何在Vaadin論壇發帖?我無法找到發佈按鈕或註冊方式:)

+0

您必須註冊才能發佈論壇裏的問題。點擊頁面頂部的「加入Vaadin」,它會將您帶到登錄屏幕,然後點擊「創建帳戶」並註冊。登錄後即可進入論壇,選擇一個類別。在該頁面上,搜索框旁邊有一個「發佈新帖子」按鈕。 – 2010-08-13 11:16:02

+0

哦,沒有看到加入Vaadin文本。它太小了:) – palto 2010-08-14 16:34:10

+0

你可以使用@Configurable,參見我自己的描述:http://info.michael-simons.eu/2013/03/12/vaadin-spring-using-configurable-in-vaadin-components/這些服務可以標記爲瞬態並且在反序列化後再次自動裝配。 – 2013-10-10 10:58:02

回答

0

似乎Vaadin書涵蓋了這個問題。他們推薦的解決方案是使用ThreadLocal來存儲服務對象。 ThreadLocal在應用程序類的transactionStart和transactionEnd中初始化並銷燬。

在Vaadin書更詳細的說明:http://vaadin.com/book/-/page/advanced.global.html

-2

在Vaadin持久性數據未存儲在您的會話中,因此您不必擔心這一點。

+0

對不起,我不明白。持久性數據如何不存儲在會話中?如果應用程序存儲在會話中,並且我的應用程序引用了EntityManager(JPA)或數據源,那麼這些存儲在哪裏? – palto 2011-01-02 07:40:56

0

我用Vaadin冬眠。我的主要應用程序類有一個會話工廠方法:

public Session getSession() { 
    Session currentSession = HibernateUtil.getSessionFactory() 
      .getCurrentSession(); 
    if(!currentSession.getTransaction().isActive()) { 
     currentSession.beginTransaction(); 
    } 
    return currentSession; 
} 

需要堅持什麼會使用到的主要應用程序的引用,然後抓住一個會話的每個類。

然後,我有一個使用HQL命名查詢的服務層,然後將該數據作爲列表返回。

public List<DataClass> getEntriesforDate(Date date, Integer key) { 
    return mainApp.getSession().getNamedQuery(DataClass.NAMEDQUERY) 
      .setParameter("key", key).list(); 
} 

爲了節約您只需要映射到表中的ORM類,你填充這個類的一個實例,然後用合併來持久化對象:

getSession().merge(o); 

下面是來自Vaadin的詳細解釋維基:

Hibernate with Vaadin

1

我的建議:

  • 將容器定義爲僅包含演示文稿數據。不要將來自演示文稿對象的任何直接引用保留到持久對象中。
  • 定義一個「加載」操作,該操作在事務中加載持久數據對象並將它們轉換爲支持您的容器的相應表示對象。
  • 將所有容器設置爲只讀(遵循模型 - 視圖 - 控制器模式:容器是模型)
  • 根據需要設置通知/觸發器,以便在基礎持久數據更改時重新加載容器。
  • 對於可擴展性,設計或使用的容器知道如何延遲加載等,這樣你就不會在一次填充整個容器(注:與TreeTable困難的 - 見issue #9516
+0

這是一個古老的問題,現在我再次閱讀,難怪我不斷得到我沒有的問題的答案:)這並不完全清楚我的實際問題是什麼,所以在這裏: 我的問題是您正在談論的實際「負載」操作。要加載或持久化數據,我有一個處理持久性和事務的MyObjectRepository。要加載或持久化對象,我必須在我的Vaadin類中引用此MyObjectRepository。 MyObjectRepository的問題在於它不能被序列化,因爲它具有數據庫連接和所有其他的東西。 – palto 2012-09-17 06:21:29

+0

如果您使用的是Spring,請嘗試[Spring Stuff](https://vaadin.com/directory#addon/spring-stuff)加載項。 – Archie 2012-09-17 13:59:13

+0

嘿,這似乎是一個優秀的圖書館!我必須嘗試一下。 – palto 2012-09-19 07:39:04