我正在增強一箇舊的Spring/Hibernate應用程序,我卡住了。我有一個讀取文件長度超過3000行的方法,每行都有一條記錄,必須與數據庫上的某個記錄進行比較,然後必須將一個寄存器添加到數據庫(多到多個表)。休眠掛起或拋出懶惰初始化沒有會話或會話被關閉
表和關係
分公司有許多產品,產品在許多分支。
產品有很多產品和類別有許多產品
還有更多的是在那裏和好的工作表。
的新表/我創建的對象是分公司,產品,BranchToProduct。
產品有一套BranchToProduct對象,其中有3場
我需要BranchToProduct對象添加到集產品,用3個領域,從信息,我從文件中的每一行得到填補。
我添加一個簡單的線和所述應用程序拋出:
產物= productDAO.findByModel(stringModel);
無法懶洋洋地初始化集合 作用: com.bamboo.catW3.domain.Product.products, 沒有會話或會話關閉
如果我去Hibernate映射(HBM文件)並設置關係product_to_products lazy = false,行單獨運行,但如果我試圖把它放在文件循環中,應用程序總是在正在處理的第18行掛起,無論我使用哪個文件或順序內容,控制檯停止工作,不得不關閉java查殺進程。無論哪種方式,在調試中,我得到很多HQL的簡單查找,13行HQL,直到我得到我的錯誤,當lazy = true,並且當我使用lazy = false並且把它放在很多行時週期。
我想我應該試着用lazy = true來解決這個問題。
這種情況讓我懷疑:
1.-當懶惰=真。我怎麼能不能運行這個命令的這一行的單行,但它在類的其他方法上工作正常?
的方式,這是一種稱爲CatalogFacade類,它實現其他clasess的方法:(CategoryFacade,ContainerFacade,ProductFacade,ProductOptionFacade,ProductStatusFacade,UserFacade,EmailFacade,FileFacade,BranchOfficeFacade)
這是代碼
productDao.find():
public Product find(Integer id) throws DataAccessException {
Product product= (Product) super.find(Product.class, id);
if(product!=null){
product.setProductAttributes(new TreeSet<ProductAttribute>(product.getProductAttributes()));
for (Product ptp : product.getProducts()){
ptp.setProductAttributes(new TreeSet<ProductAttribute>(ptp.getProductAttributes()));
}
}
異常被拋出了就在這條線,在最後爲:
pptp.setProductAttributes(new TreeSet<ProductAttribute>(ptp.getProductAttributes()))
在Intelij的調試器,我可以看到從查詢錯誤地形成的物體:){[email protected]}unable
product.getProducts(=計算表達式方法扔「org.hibernate作爲.LazyInitializationException'異常。
如何過其他屬性都OK。該產品甚至沒有其他產品在數據庫中。
UPDATE
挖的情況越深,
product.find內(INT)
在行之前,我得到的異常,我們可以看到product.products數組有錯誤的調試,而不是您可以看到lazyInitialitationException的值。 如何從,如果我從另一個方法調用它,該數組是查找。所以它不能在它內部即使該方法只接收一個整數。
此外,我們發現,這已經沿着應用的全生命週期的發生,有時工作人員複製的方法一樣,但更改它設置爲null這個損壞的陣列。所以我100%肯定這個應用程序正在消耗更多的資源。
它有意見Flex和JSTL中後視圖,其中創造,並根據誰在調用方法時,例外在同一方法不同的方式拋出。
添加更多信息。這是produt.find如何在AbstractDAOImpl實施:
public final Object find(Class clazz, Integer id) throws DataAccessException{
return getHibernateTemplate().get(clazz,id);
}
,這是我的事務管理器的配置,在由彈指第一個答案描述沒有工作的標註方法:
<bean id="catalogFacade" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"> <ref local="transactionManager"/> </property> <property name="target"> <ref local="catalogFacadeTarget"/> </property> <property name="transactionAttributes"> <props> <prop key="add*">PROPAGATION_REQUIRED</prop> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="remove*">PROPAGATION_REQUIRED</prop> <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop> <prop key="find*">PROPAGATION_SUPPORTS,readOnly</prop> <prop key="contains*">PROPAGATION_SUPPORTS,readOnly</prop> <prop key="login*">PROPAGATION_SUPPORTS,readOnly</prop> </props> </property> </bean>
其實這就是如何在程序已經在做了,看到更新代碼 – Ernest 2011-05-31 23:20:38