2016-11-02 53 views
0
Map<String, Type> myMap = new HashMap<String, Type>(); 

Query query = session.createQuery("" + 
     "SELECT a " + 
     "FROM Articulo a "); 
List<Object> list = query.list(); 

// Add all query elements to the hashmap 
for (Object entrada : lista) { 
    myMap.put(entrada.getKey(), (Type) entrada); 
// Type someOtherObject = entrada.getReferencedProperty(); 
} 

Type someObject = (Type) myMap.get("someValidKey").getReferencedProperty(); //normal getter 

這裏someObject出來null和對象被分離。但是,如果我取消註釋someOtherObject行。關係被正確提取。休眠爲什麼我的對象變得分離?

這是怎麼回事?

+1

這些實際上是在相同的方法嗎?這種區分非常重要。我猜不是,因爲'codLineas'沒有在您發佈的代碼中的任何地方定義。 – rmlan

+0

@rmlan對不起,我正在簡化代碼,我錯過了。我現在編輯它。代碼是同一方法的一部分。 – harogaston

回答

1

我發現了這個問題。在我的代碼中更深一層,我打電話給session.clear()。這導致我所有的實體都被分離。

+0

遇到過相同的問題!''在'flushService'中調用session.clear() – Kuba

1

我沒有看到您的整個代碼庫,但是您的對象由於離開事務上下文(或者您並不處於事務中)而被分離的情況下,您看不到您的整個代碼庫。

related answer

只要用於保存,加載,獲取或找到一個實體已經關閉會話,實體已分離。這意味着它不再與會話連接,並且與任何其他POJO一樣工作。

+0

我沒有明確地關閉會話。是否有任何理由自動關閉? – harogaston

+0

或者它在事務中,但'ReferenceProperty'是複雜的對象,默認情況下不能初始化。請參閱'獲取類型EAGER/LAZY'。順便說一句'entrada.getReferencedProperty();'在循環可以使其他查詢,因此你看到該對象被連接。 –

+0

你在使用'@ Transactional'嗎?您需要向我們展示更多代碼才能進一步幫助您。 –