求助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过来,后者会出现你所说的问题。