我正在使用Spring事務,因此當POJO到DTO轉換髮生時事務仍處於活動狀態。防止Dozer觸發Hibernate延遲加載
我想阻止Dozer觸發延遲加載,這樣就不會發生隱藏的SQL查詢:所有抓取都必須通過HQL明確完成(以獲得對性能的最佳控制)。
這是一個很好的做法(我無法在任何地方找到它)嗎?
如何安全地做到這一點?
我DTO轉換之前試過這樣:
PlatformTransactionManager tm = (PlatformTransactionManager) SingletonFactoryProvider.getSingletonFactory().getSingleton("transactionManager");
tm.commit(tm.getTransaction(new DefaultTransactionDefinition()));
我不知道會發生什麼交易,但Hibernate的Session不會被關閉,並且延遲加載仍然存在。
我嘗試這樣做:
SessionFactory sf = (SessionFactory) SingletonFactoryProvider.getSingletonFactory().getSingleton("sessionFactory");
sf.getCurrentSession().clear();
sf.getCurrentSession().close();
,並阻礙了延遲加載,但它是直接在應用層(被稱爲我的項目「門面」)操縱會話的好的做法呢?我應該害怕哪種負面影響? (我已經看到,涉及POJO - > DTO轉換的測試不能再通過AbstractTransactionnalDatasource Spring測試類來啓動,因爲這些類試圖觸發對沒有更多鏈接到活動會話的事務的回滾)。
我也嘗試將傳播設置爲NOT_SUPPORTED或REQUIRES_NEW,但它重用了當前的Hibernate會話,並且不會阻止延遲加載。
謝謝,這很好,我甚至可以確認它沒有記錄在其他地方:http://www.google.fr/search?q=CustomFieldMapper+PersistentSet – Tristan 2011-05-12 05:51:48
此外,在最新版本的Dozer(5.3.0 ),還有另外一種方法可以做到這一點(http://sourceforge.net/tracker/?func=detail&aid=2993122&group_id=133517&atid=727370) – Tristan 2011-05-12 06:03:16
'destination = null'這行是無操作的,不知道爲什麼在那兒... – 2012-11-19 09:19:45