keruis 2014-05-23
<hibernate-mapping> <class name="com.wht.tables.MerchantFeeRate" table="MERCHANT_FEE_RATE" dynamic-update="true"> <composite-id name="id" class="com.wht.tables.MerchantFeeRateId"> <key-many-to-one name="merchant" class="com.wht.tables.Merchant"> <column name="MERCHANT_NO" length="20" /> </key-many-to-one> <key-many-to-one name="tradeType" class="com.wht.tables.TradeType"> <column name="TRADE_TYPE" length="4" /> </key-many-to-one> </composite-id> <property name="rate" type="java.math.BigDecimal"> <column name="RATE" precision="6" scale="4" not-null="true" /> </property> </class> </hibernate-mapping>
通常在使用联合主键,也意味着这些列也是别的表的主键,既是主键,又是外键,这是hibernate映射中比较复杂的情况。对于双主键,双外键这种常见的情况将会带来如下问题:
1.排序字段怎么写?
只能写id;hibernate相当于会按照该表的主键排序。
如果我们想按照关联表的某个其它字段来排序呢?因为主键通常是编号,通常我们希望排序的是名称字段什么的。
qb.getDetachedCriteria().setFetchMode("id.merchant",FetchMode.JOIN);
qb.getDetachedCriteria().createAlias("id.merchant","c");
qb.addOrderBy(Order.asc("c.merchantName"));
结论是:通过id类无法关联到关联表,innerjoin不上关联表,不知道为什么。是不支持这么操作还是什么原因?
2.查询条件有可能是关联表的某列,如何进行关联?
当前没有解决1,2问题,所以没有单独映射主键类,从而此处变通,使用了hql查询,返回数据中由于包含了关联表的字段。所以返回结果成了数组。不能按照对象去取。
3.如何唯一确定一条记录?
这个比较好办,构造id对象,然后使用条件查询:
CardSubTypeIdcardSubTypeId=newCardSubTypeId(selectedMainType,cardParaInfo.getCardSubTypeId().getCardSubType());
Criterion[]criterion=newCriterion[]{Restrictions.eq("cardSubTypeId",cardSubTypeId)};
CardParacp=(CardPara)cardParaDao.getFirst(CardPara.class,criterion);