2013-04-30 175 views
2

在我的工作中,我使用exidirect的spring,服務器端的hibernate和客戶端的extjs。當我發佈一個表單時,在服務器端彈簧將其轉換爲實體。 實體有一個id字段,它表示更新操作。 我打電話的服務保存方法,而是一個sql 更新查詢我得到許多選擇查詢,然後更新。這需要很多時間。這個操作不需要。 我看到類似的問題,並試圖使用堅持方法。 這種情況下,我得到錯誤:傳遞給persist的分離實體。更新前休眠選擇

我沒有足夠的休眠經驗。可能是我需要配置相關實體​​(OneToMany,ManyToOne和級聯類型)。實體由Spring roo工具生成。

有什麼建議嗎? 謝謝。

+0

'select-before-update'屬性是否設置爲'true'? – lunr 2013-05-19 09:14:50

+0

這個屬性在哪裏? – Damask 2013-05-19 11:44:34

+1

這是在課堂上定義的。例如,如果你正在使用註釋,'@ org.hibernate.annotations.Entity(selectBeforeUpdate = true ...)' – lunr 2013-05-19 11:58:19

回答

5

這不是你的問題的最終答案,但我希望它可以作爲一個高層次的指導方針。

當您使用Spring創建實體時,該實體會被分離,並且Hibernate會執行這些SELECT語句,因爲它需要在持久化之前附加您的實體。此外,據我所知,任何附加實體的嘗試都會觸發SELECT語句。因此,我堅信沒有任何方法可以在沒有這些SELECT語句的情況下保存/保留分離的實體(在這裏我可能會錯誤地指出錯誤)。

如果您擔心性能問題,可以嘗試在應用程序中添加一些緩存功能。此外,您還可以將JDBC解決方案僅用於性能受到影響的操作。

+0

我可以理解,如果hibernate使保存之前附加一個查詢,但我不明白,如果休眠使50 ,保存這一個之前的100個查詢。 Ajax請求因超時而失敗 – Damask 2013-05-01 03:00:30

+0

有趣,在這種情況下可能值得檢查OneToMany ManyToOne關係。這是一個有很多關係的班級嗎? – Rafa 2013-05-01 19:04:17

+0

是的,它是醫療系統,患者,診斷,處方 - 它有很多關係。我需要檢查什麼? – Damask 2013-05-02 02:46:43

0

將@SelectBeforeUpdate(false)註釋添加到實體。

+0

其實這不行,可能只是在我的情況 – AlexB 2017-04-05 13:26:31