hibernate联合主键有关问题

求助hibernate联合主键问题
StoreAfter 和AfterCommission 是一对多的关系 ,StoreAfter 的主键storeNumber是AfterCommission 的外键
AfterCommission的主键是联合主键(STORENUMBER,PAYMENTTYPE,AREAID)
实体类如下
Java code

StoreAfter.java
public class StoreAfter extends BaseEntity implements Serializable{
    private static final long serialVersionUID = 4038378438651961912L;
    private String StoreNumber;//门店
    private int openstate;//门店后返启用状态
    private String  operater;//操作者
    private String  modifdate; //修改日期
    private String  jfcs1;//预留参数1
    private String  jfcs2;//预留参数2
    private String  note ;//日志
    Set<AfterCommission> afterCommission = new HashSet<AfterCommission>(0);
...................................省略
}
AfterCommissionPKID.java
public class AfterCommissionPKID extends BaseEntity implements Serializable{

    private static final long serialVersionUID = -6654357823934475704L;
    private StoreAfter storeNumber; //门店
    private Integer paymentType;    //缴费类型    
    private String areaId;      //地区号
    
    //它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof AfterCommissionPKID){ 
            AfterCommissionPKID pk=(AfterCommissionPKID)obj; 
            if(this.storeNumber.equals(pk.storeNumber)&&this.paymentType==pk.paymentType&&this.areaId.equals(pk.areaId)){ 
                return true; 
            } 
        } 
        return false;
    }
    @Override
    public int hashCode() {
        final int prime = 31; 
        int result = 1; 
        result = prime * result + ((storeNumber == null) ? 0 : storeNumber.hashCode()); 
        result = prime * result + ((paymentType == null) ? 0 : paymentType.hashCode()); 
        result = prime * result + ((areaId == null) ? 0 : areaId.hashCode()); 
        return result; 
    }
。。。。。。。。省略
}    

AfterCommission.java
public class AfterCommission extends BaseEntity implements Serializable{
    private static final long serialVersionUID = 3605580290128721830L;
    private UUID afterCommId;    
    private AfterCommissionPKID afterCommissionPKID ;
    private int aftertype;      //后返类型
    private int afterNum;       //后返量反额度    
    private String  afterComm;  //后返比例
    private int channelstate;   //类型地区后返开启状态
    private String operater;    //操作者
    private String modifdate;   //修改日期
    private String jfcs1;       //预留参数1
    private String jfcs2;       //预留参数2
    private String note ;       //日志
...................省略
}


配置文件如下
XML code

StoreAfter.hbm.xml
<hibernate-mapping>
    <class name="com.neili.mdgl.hibernate.mdyj.entity.StoreAfter" table="STOREAFTER">
        <id name="storeNumber" type="java.lang.String">
            <column name="STORENUMBER" precision="10" scale="0" />
        </id>
        <property name="openstate" type="java.lang.Integer">
            <column name="OPENSTATE"/>
        </property>
         <property name="operater" type="java.lang.String">
            <column name="OPERATER" />
        </property>
        <property name="modifdate" type="java.lang.String">
            <column name="MODIFDATE" />
        </property>
       <property name="jfcs1" type="java.lang.String">
               <column name="jfcs1"/>
       </property>
        <property name="jfcs2" type="java.lang.String">
            <column name="jfcs2"/>
        </property>
        <property name="note" type="java.lang.String">
           <column name="note"/>
       </property>
        <set name="afterCommission" inverse="true" cascade="save-update">
            <key>
                <column name="STORENUMBER" precision="10" scale="0" not-null="true"/>
            </key>
            <one-to-many class="com.neili.mdgl.hibernate.mdyj.entity.AfterCommission" />
        </set>
    </class>
</hibernate-mapping>
---------------------------------
AfterCommission.hbm.xml
<hibernate-mapping>
    <class name="com.neili.mdgl.hibernate.mdyj.entity.AfterCommission" table="aftercommission">
       <composite-id name="afterCommissionPKID" class="com.neili.mdgl.hibernate.mdyj.entity.AfterCommissionPKID">
               <key-many-to-one name="storeNumber" class="com.neili.mdgl.hibernate.mdyj.entity.StoreAfter">
                  <column name="STORENUMBER"/> 
              </key-many-to-one>
               <key-property name="paymentType" type="java.lang.Integer">
                   <column name="PAYMENTTYPE" />
               </key-property>
               <key-property name="areaId" type="java.lang.String">
                    <column name="AREAID"/>
               </key-property>
       </composite-id>
         <property name="afterCommId" type="java.util.UUID" >
            <column name="AFTERCOMMID" precision="10" scale="0" />
        </property>
        <property name="aftertype" type="java.lang.Integer">
            <column name="AFTERTYPE"/>
        </property>
        <property name="afterNum" type="java.lang.Integer">
            <column name="AFTERNUM" />
        </property>
        <property name="afterComm" type="java.lang.String">
            <column name="AFTERCOMM"/>
        </property>
        <property name="channelstate" type="java.lang.Integer">
            <column name="CHANNELSTATE"/>
        </property>
         <property name="operater" type="java.lang.String">
            <column name="OPERATER" />
        </property>
        <property name="modifdate" type="java.lang.String">
            <column name="MODIFDATE" />
        </property>
       <property name="jfcs1" type="java.lang.String">
               <column name="jfcs1"/>
       </property>
        <property name="jfcs2" type="java.lang.String">
            <column name="jfcs2"/>
        </property>
         <property name="note" type="java.lang.String">
            <column name="note"/>
        </property>
    </class>
</hibernate-mapping>