例如,商品表,库房表,库存表。商品表与库存表是一对多,库房表与库存表是一对多
商品映射文件是:
……
<set name="kcxxs" lazy="true" inverse="true" table="sp_kcxx">
<key column="spid" />
<composite-element class="com.wangbass.pojo.SpKcxx">
<parent name="spBaseinfo" />
<many-to-one name="spKfxx"
class="com.wangbass.pojo.SpKfxx" column="kfbh" not-null="true">
</many-to-one>
<property name="kcsl" column="kcxl"
type="java.math.BigDecimal" not-null="true">
</property>
</composite-element>
</set>
……
库房映射文件是:
……
<set name="kcxxs" lazy="true" table="sp_kcxx">
<key column="kfbh"></key>
<composite-element class="com.wangbass.pojo.SpKcxx">
<parent name="spKfxx" />
<many-to-one name="spBaseinfo"
class="com.wangbass.pojo.SpBaseinfo" column="spid"
not-null="true">
</many-to-one>
<property name="kcsl" column="kcxl" type="java.math.BigDecimal" not-null="true"></property>
</composite-element>
</set>
……
库存表没有映射文件,只有实体类SpKcxx.class
private SpBaseinfo spBaseinfo;
private SpKfxx spKfxx;
private BigDecimal kcsl;
现已产生一些新的库存实体类并已加到数据库中去,现在要读出其中一个库存,做以修改,可如何能读出单个库存。
库存表结构:create table sp_kcxx (
spid varchar(10) not null,
kfbh varchar(5) not null,
kcsl decimal(8,2) null,
constraint PK_SP_KCXX primary key (nbbm, kfbh)
)
go
我用如下方法,返回的却是null
public Object get(Session session, String kfbh, String spid)
throws Exception {
Criteria criteria =session.createCriteria(SpKcxx.class);
Criterion criterion1=Expression.eq("kfbh",kfbh);
Criterion criterion2=Expression.eq("spid",spid);
criteria=criteria.add(criterion1);
criteria=criteria.add(criterion2);
List list=criteria.list();
if(list.size()!=0){
SpKcxx sk=(SpKcxx)list.get(0);
return list.get(0);
}
else return null;
}
那么如何用hibernate获得composite-element映射的单个对象呢,请教了。
[e08]今天看书明白了,组成关系的映射中,kcxx类是值类型,不是实体类型,所以不要能单独获得,因此上文中无法获得spkcxx的对象。要想单独获得,不能映射成组成关系,须映射成实体关联关系,即spBaseinfo与spKcxx是一对多,spKfxx与spKcxx也是一对多。如此才能单独获得,上文中须定义联合主键SpKcxxId。