2011-07-28 39 views
7

我的問題是與分離的對象...在擁有已知主鍵的同時在Hibernate中持久化對象。

我目前使用Spring與Hibernate。

我有一個主鍵爲String的映射對象(我知道它很糟糕......但重構代碼需要幾個月),我希望堅持下去。 (我已經簡化了對象只有兩個屬性)

@Id 
private String id; 

private String pattern; 

因此,例如,我想補充一點,如:

[「身份證」:「myFirstPattern」,「模式」:「*」]

請注意,我的主鍵已經設置。問題在於,無論何時我試圖堅持,Hibernate都會嘗試將該對象與上下文中的任何對象(由於主鍵)關聯,並且將無法這樣做,因爲沒有。拋出分離的對象錯誤。

我已經做了一些研究,得出結論merge()將滿足我的需求,因爲即使對象不可用,它仍然存在並更新。但是,我發現這是一個相當髒的解決方法,並希望檢查是否有任何其他解決方案來解決這個問題。

考慮到我們有一個Helper圖層,所以Services圖層不會直接與HibernateDao圖層一起工作。所以我可以通過添加將會調用相同的合併DAO方法的'persist'和'update'方法來「屏蔽」這個。

謝謝, 弗拉維奧。

+0

嗨弗拉維奧,你可以請張貼您的休眠映射配置?你能確認你的Hibernate映射能夠從數據庫中檢索對象嗎? – Caps

+0

<丙鍵= 「hibernate.dialect」> org.hibernate.dialect.MySQL5Dialect <丙鍵= 「hibernate.hbm2ddl.auto」>驗證 <丙鍵= 「hibernate.show_sql」>假 <丙鍵=」 hibernate.format_sql 「>假 <丙鍵=」 hibernate.jdbc.batch_size 「> 0 <丙鍵=」 在hibernate.cache.provider_class「> net.sf。 ehcache.hibernate.SingletonEhCacheProvider

+0

<映射類= 「com.dao.model.Plan」/> \t \t <映射類= 「com.dao.model.TrunkGroup」/> \t \t <映射類=」 com.dao.model.Route」 /> \t \t <類的高速緩存使用= 「讀 - 寫」 類= 「com.dao.model.Plan」/> \t \t \t \t

回答

1

您是否嘗試過saveOrUpdate?

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    session.saveOrUpdate(yourObjectHere); 

    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 
+0

我試着用SaveOrUpdate,但我相信我的緩存數據庫使用JUnit弄亂了,因爲我手動刪除通過SQL查詢一些數據。當我在之前的測試中刪除它之後,第二次嘗試保留同一個對象時,我不斷收到StaleStateException錯誤。我們不太可能會做任何手動刪除,但這仍然是JUnit在那裏測試一切的原因。 –

0

我不能肯定,我不能嘗試它自己的權利,但不設置@Id屬性設置爲使用"assigned"發電機做到這些?

+0

不可能發現任何具體的@Id,儘管我發現別人GeneratedId,等等...不知道這將如何幫助我。 GeneratedValue策略與數據庫權限有關?我以前曾與這些人一起工作過,但我以前的經歷都是使用規範化的數據庫... –

1

我嘗試了Mauricio給我的想法後,嘗試了一些不同的方法。由於SaveOrUpdate正在使用緩存實體來驗證它是否應該更新或保存一個對象,我想在保存對象之前進行清理。

所以,這裏是我的一段代碼:

try { 
     getHibernateTemplate().clear(); 
     getHibernateTemplate().save(entity); 
    } catch (DataAccessException e) { 
     if (e.getCause() instanceof ConstraintViolationException) 
      throw new HibernateDaoException("Entity could not be persisted. Constraint violation."); 
     throw new HibernateDaoException(e); 
    } 

現在,它正在按照預期,儘管它似乎會殺了我的緩存數據庫存在的理由......不過此更新功能將被謹慎使用,因爲組件的主要原因是返回信息,匹配模式並返回最佳結果。

無論如何,如果我發現任何缺陷,我會很快回來。

任何意見,請隨時張貼:)

相關問題