2010-02-14 69 views
4

我目前在桌面應用程序中使用JPA進行實驗,同時使用BeansBinding使GUI開發更容易。迄今爲止,結果相當不錯。使用JPA和BeansBinding保存數據

作爲一個示例應用程序,我有一個只有一個表的小型數據庫。我成功創建了實體PU。接下來,我將一個JTable放入主JFrame中,並將它的列綁定到JPA查詢。這像一個魅力。因此,對實體所做的更改反映在表中,反之亦然。

接下來我想讓表格可編輯,以便更改保留到數據庫中。我想出的最簡單的方法是開始查詢並立即提交。因此,假設我有一個JButton的地方,做actionPerformed如下:

private void saveClicked(java.awt.event.ActionEvent evt) { 
    this.myEntityManager.getTransaction().begin(); 
    this.myEntityManager.getTransaction().commit(); 
} 

這完美的作品,但它看起來奇怪的是我錯了。我也試過在windowClosing上這樣做。成功。

但爲什麼這個工作?我的意思是,在交易begincommit之間沒有任何代碼。更重要的是,O.K.去做這個?

回答

2

這種有點不穩定的行爲,其中實體管理器在未明確告知的情況下仍然存在未提交的更改,這是因爲應用程序管理實體管理器始終處於擴展狀態。 JPA規範(在第3.3節)表示:

應用程序管理的實體 管理器的持久性上下文 的範圍被擴展。它是 應用程序的責任, 管理持久性上下文的生命週期。

所以,當有問題的豆已經在持久化上下文,你沒有一個明確的entitymanager.persist執行器transaction.commit任何未提交的更改都將持續甚至。您可以在提交事務之前通過清除實體管理器(entitymanager.clear)來驗證此行爲。這將從tx-commit中移除實體,並且會導致事務不對數據庫進行任何更改。

+0

哎呀......完全忘了接受這個...... :)比晚上更好遲到:) – exhuma 2010-06-23 11:38:39