<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类无法关联到关联表,inner join不上关联表,不知道为什么。是不支持这么操作还是什么原因?
2. 查询条件有可能是关联表的某列,如何进行关联?
当前没有解决1,2问题,所以没有单独映射主键类,从而此处变通,使用了hql查询,返回数据中由于包含了关联表的字段。所以返回结果成了数组。不能按照对象去取。
3. 如何唯一确定一条记录?
这个比较好办,构造id对象,然后使用条件查询:
CardSubTypeId cardSubTypeId = new CardSubTypeId(selectedMainType, cardParaInfo.getCardSubTypeId().getCardSubType());
Criterion [] criterion = new Criterion[]{Restrictions.eq("cardSubTypeId", cardSubTypeId)};
CardPara cp = (CardPara)cardParaDao.getFirst(CardPara.class, criterion);