2014-10-22 43 views
1

我在Project和ProductCatalogItem兩個類之間有一個雙向的多對多映射。在項目文件HBM定義的映射是如下 -Hibernate bidrectional多對多刪除元素拋出異常

<set name="catalogItems" table="PAS_PRODUCT_CATALOG_PROJECT" 
    inverse="false" lazy="true" cascade="all-delete-orphan"> 
    <key column="PROJECT_ID_" /> 
    <many-to-many column="PRODUCT_CATALOG_ITEM_ID_" class="com.palamida.appsec.model.ProductCatalogItem" /> 
</set> 

在ProductCatalogItem映射被定義如下 -

<set name="itemInProjects" table="PAS_PRODUCT_CATALOG_PROJECT" 
    inverse="true" lazy="true"> 
    <key column="PRODUCT_CATALOG_ITEM_ID_" /> 
    <many-to-many column="PROJECT_ID_" class="com.palamida.appsec.model.Project" /> 
</set> 

有定義三個表 - PROJECT,PRODUCT_CATALOG_ITEM,和PAS_PRODUCT_CATALOG_PROJECT(聯接表)

項目類有catalogItems

private Set<ProductCatalogItem> catalogItems = new HashSet<ProductCatalogItem>(); 

ProductCatalogItem具有itemsInProject

private Set<Project> itemInProjects = new HashSet<Project>(); 

每個屬性具有相應的吸氣劑,和setter。 還有,增加了邏輯/刪除從ProductCatalogItem項目如下 -

public void updateProductCatalogItemsToProject(Project project, 
             Map<EntityOperationEnum,Set<ProductCatalogItem>> modifiedCatalogItems) { 
    if (project != null && modifiedCatalogItems != null && !modifiedCatalogItems.isEmpty()) { 
     Set<ProductCatalogItem> newCatalogItems = modifiedCatalogItems.get(EntityOperationEnum.ADD); 
     Set<ProductCatalogItem> deleteCatalogItems = modifiedCatalogItems.get(EntityOperationEnum.REMOVE); 

     if (newCatalogItems != null && !newCatalogItems.isEmpty()) { 
      project.getCatalogItems().addAll(newCatalogItems);  
     } 
     if (deleteCatalogItems != null && !deleteCatalogItems .isEmpty()) { 
      project.getCatalogItems().removeAll(deleteCatalogItems);  
     } 
    } 
} 

當只有要被添加的元素,數據被插入到鏈接表中。但是,當要刪除的項,然後我碰到下面exception-

org.springframework.dao.InvalidDataAccessResourceUsageException: could not initialize a collection: [com.palamida.appsec.model.ProductCatalogItem.childProductCatalogItems#17]; SQL [select childprodu0_.PROJECT_ID_ as PROJECT9_89_1_, childprodu0_.ID_ as ID1_1_, childprodu0_.ID_ as ID1_89_0_, childprodu0_.VERSION_ as VERSION2_89_0_, childprodu0_.ITEM_NUMBER_ as ITEM3_89_0_, childprodu0_.ITEM_NAME_ as ITEM4_89_0_, childprodu0_.ITEM_DESCRIPTION_ as ITEM5_89_0_, childprodu0_.PLATFORM_NAME_ as PLATFORM6_89_0_, childprodu0_.RELEASE_NAME_ as RELEASE7_89_0_, childprodu0_.PARENT_ID_ as PARENT8_89_0_ from PAS_PRODUCT_CATALOG_ITEM childprodu0_ where childprodu0_.PROJECT_ID_=? order by childprodu0_.ITEM_NAME_ asc]; nested exception is org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.palamida.appsec.model.ProductCatalogItem.childProductCatalogItems#17] 
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:635) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'childprodu0_.PROJECT_ID_' in 'field list' 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57 

不應該SELECT是具有基於PROJECT_ID_的PAS_PRODUCT_CATALOG_PROJECT表的連接?我沒有看到發生。 Iam在映射中缺少什麼? 你能幫我解答嗎?

+0

我需要提到的是,這兩個類都有equals和hashcode的適當實現 – 2014-10-22 02:17:18

回答

0

我發現了這個問題。這是我的cascade =「all-delete-orphan」的映射。據冬眠文檔

It does not usually make sense to enable cascade on a many-to-one or many-to-many association. 
In fact the @ManyToOne and @ManyToMany don't even offer a orphanRemoval attribute. 
Cascading is often useful for one-to-one and one-to-many associations. 

所以,當我試圖從關聯中刪除,休眠試圖從CATALOG_ITEM表連接列「PROJECT_ID_」刪除它。因此錯誤。 一旦我將其修改爲「全部」,事情就開始奏效。