2012-08-03 66 views
0

我不知道我的设计本身是错的还是什么。但任何机构可以给我一个解决方案。 我有一个Object,PlanningItem。从这我需要通过使用PlanningItem的两个属性获取记录形成另一个表。所以我创建了视图并在PlanningItem中将该视图添加为多个关系记录。当我更新计划项目时,我收到错误消息。 在此我准备将视图改为和再选择或其他任何东西。请提出建议继续。如何避免在更新hibernate中的父级时更新子对象?

以下是我的代码。

ViewPlannigItem.hbm.xml

<class 
     name="com.cotyww.ipmasterdata.core.entity.master.ViewPlannigItem" 
     table="VW_PLANNING_ITEM" > 
     <id name="planningIrc" type="string" column="PLANNING_IRC"> 
      <generator class="assigned" /> 
     </id> 

     <property name="planningIRCDesc" column="PLANNING_ITEM_DESC" 
      type="string" /> 


     <property name="programId" column="PROGRAM_ID" type="string" /> 


     <property name="salesOrgId" column="SALES_ORG_ID" 
      type="integer" /> 

     <property name="salesBrandId" column="SALES_BRAND_PKEY" 
      type="integer" /> 

     <many-to-one name="salesBrand" update="false" insert="false" 
      class="com.cotyww.ipmasterdata.core.entity.master.SalesBrand" 
      column="SALES_BRAND_PKEY" /> 

     <many-to-one name="salesOrg" update="false" insert="false" 
      class="com.cotyww.ipmasterdata.core.entity.master.SalesOrg" 
      column="SALES_ORG_ID" /> 

    </class> 

PlanningItem.hbm.xml

<class 
     name="com.cotyww.ipmasterdata.core.entity.master.PlanningItem" 
     table="Planning_Item"> 
     <id name="planningIrc" type="string" column="PLANNING_IRC"> 
      <generator class="assigned" /> 
     </id> 

     <property name="programId" column="Program_Id" type="string" /> 

     <property name="planningitemDesc" column="Planning_Item_Desc" 
      type="string" /> 

     <many-to-one name="hierarchyCode" update="false" insert="false" 
      class="com.cotyww.ipmasterdata.core.entity.master.GmmBrand" 
      column="Gmm_Hierarchy_Code" /> 

     <property name="gmmhierarchyCode" column="Gmm_Hierarchy_Code" 
      type="string" /> 

     <many-to-one name="gmmcategoryCode" update="false" 
      insert="false" 
      class="com.cotyww.ipmasterdata.core.entity.master.GmmCategory" 
      column="Category_Code" /> 
     <property name="categoryCode" column="Category_Code" 
      type="string" /> 

     <set name="lstViewPlanningItem" cascade="none" > 
      <key column="PLANNING_IRC" /> 
      <one-to-many not-found="ignore" 
       class="com.cotyww.ipmasterdata.core.entity.master.ViewPlannigItem" /> 
      <filter name="planningsalesORg" 
       condition="SALES_ORG_ID = :salesOrgId" /> 
     </set> 

     <property name="modifiedBy" column="Audit_User" type="string" /> 
     <property name="modifiedDate" column="Audit_Date" type="date" /> 
     <property name="createdBy" column="Created_By" type="string" /> 
     <property name="createdDate" column="Created_Date" type="date" /> 

    </class> 
    <sql-query name="nextPlanningItemSequenceValueC1US"> 
     <![CDATA[ SELECT SQ_PLANNING_ITEM_PKEY_C1US.nextVal FROM dual ]]> 
    </sql-query> 

     <sql-query name="nextPlanningItemSequenceValueC1CA"> 
     <![CDATA[ SELECT SQ_PLANNING_ITEM_PKEY_C1CA.nextVal FROM dual ]]> 
    </sql-query> 

     <sql-query name="nextPlanningItemSequenceValueL1US"> 
     <![CDATA[ SELECT SQ_PLANNING_ITEM_PKEY_L1US.nextVal FROM dual ]]> 
    </sql-query> 

     <sql-query name="nextPlanningItemSequenceValueL1CA"> 
     <![CDATA[ SELECT SQ_PLANNING_ITEM_PKEY_L1CA.nextVal FROM dual ]]> 
    </sql-query> 

     <sql-query name="nextPlanningItemSequenceValueP1US"> 
     <![CDATA[ SELECT SQ_PLANNING_ITEM_PKEY_P1US.nextVal FROM dual ]]> 
    </sql-query> 

     <sql-query name="nextPlanningItemSequenceValueP1CA"> 
     <![CDATA[ SELECT SQ_PLANNING_ITEM_PKEY_P1CA.nextVal FROM dual ]]> 
    </sql-query> 
    <filter-def name="planningsalesORg"> 
     <filter-param name="salesOrgId" type="integer" /> 
    </filter-def> 

数据库查看

CREATE OR REPLACE FORCE VIEW COREMASTER.VW_PLANNING_ITEM 
(PLANNING_IRC, PLANNING_ITEM_DESC, PROGRAM_ID, SALES_ORG_ID, SALES_BRAND_PKEY, 
GMM_HIERARCHY_CODE) 
AS 
SELECT P.PLANNING_IRC, 
      P.PLANNING_ITEM_DESC, 
      P.PROGRAM_ID, 
      nvl(MAP.SALES_ORG_ID,MAP1.SALES_ORG_ID) as sales_org, 
      nvl(MAP.SALES_BRAND_PKEY,MAP1.SALES_BRAND_PKEY) as sales_brand_pkey, 
      P.GMM_HIERARCHY_CODE 
    FROM PLANNING_ITEM P, 
      GMM_MAP MAP, 
      GMM_MAP MAP1  
    WHERE 
      P.GMM_HIERARCHY_CODE = MAP.GMM_HIERARCHY_CODE(+) 
      AND P.CATEGORY_CODE = Map.GMM_CATEGORY_CODE(+) 
      AND P.GMM_HIERARCHY_CODE = MAP1.GMM_HIERARCHY_CODE(+) 
      AND Map1.GMM_CATEGORY_CODE IS NULL; 

回答

1

尝试在一个一对多的关系的一侧设置参数inverse =“true”。这会告诉hiberante在更新父级时不更新关系(FK列)。

我的意思是未来:

<set name="lstViewPlanningItem" cascade="none" inverse="true"> 
     <key column="PLANNING_IRC" /> 
     <one-to-many not-found="ignore" 
       class="com.cotyww.ipmasterdata.core.entity.master.ViewPlannigItem" /> 
     <filter name="planningsalesORg" 
       condition="SALES_ORG_ID = :salesOrgId" /> 
</set> 
0

这不是你该怎么一般使用Hibernate。将您的对象直接与相关表关联,然后可以定义查询以使用您放入视图中的筛选等来获取它们。我建议您阅读JPQL查询JPA对象。

+0

我明白,整个没有遵循任何架构..我只是采取解决这个问题。即使表没有任何foriegnkey引用..这些只是普通的数据。 – Jothi 2012-08-03 08:42:04

相关问题