首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

hibernate联合主键有关问题

2012-02-03 
求助hibernate联合主键问题StoreAfter 和AfterCommission 是一对多的关系,StoreAfter 的主键storeNumber是

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

Java code
StoreAfter.javapublic 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.javapublic 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.javapublic 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> 


Java code
Action里面实体填充代码StoreAfter storeafter = new StoreAfter(); //实体类        storeafter.setStoreNumber(storeNumber);        ............        Set<AfterCommission> afterCommissionset = new HashSet<AfterCommission>(0);        for(int i = 0; i<areaId.length; i++)        {            AfterCommission afterCommission = new AfterCommission();//实体类            afterCommission.setAfterCommId(UUID.randomUUID());            AfterCommissionPKID afterCommissionPKID = new AfterCommissionPKID();            afterCommissionPKID.setStoreNumber(storeafter);            afterCommissionPKID.setPaymentType(paymentType);            afterCommissionPKID.setAreaId(areaId[i]);            afterCommission.setAfterCommissionPKID(afterCommissionPKID);            afterCommission.setAftertype(Integer.parseInt(aftertype[i]));            .........................            afterCommissionset.add(afterCommission);        }        storeafter.setAfterCommission(afterCommissionset);        afterCommissionService.save(storeafter);

DAO里面的save方法里面用的是super.getHibernateTemplate().saveOrUpdate(entity);
出的问题是只要保存不同数据每次都成功,但是修改功能时可以添加记录,保存出粗因为有主键相同的记录
错误代码
Java code
INFO org.hibernate.type.SerializableType - could not read column value from result set: AFTERCOM4_3_; could not deserializeorg.springframework.orm.hibernate3.HibernateSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize


[解决办法]
我的hibernate功底不够,没有高手带我不敢随便在项目中使用,来学习学习
[解决办法]
修改的时候直接修改从hibernate拿出来的对象,不要new一个对象然后再把hibernate对象属性copy过来,后者会出现你所说的问题。

热点排行