Java语言按内存地址来识别和区分同一个类的不同对象而关系数据库按主键值来识别和区分同一个表中的不同记录Hibernate使用对象标识符(OID)来建立内存中的对象和数据库中记录的对应关系对象的OID和数据库表的主键对应
自然主键(具有业务含义的字段)如用户自定义的NAME而代理主键不具备业务含义的字段该字段一般取名为ID
在java语言中==判断的是引用equals判断的是值因此
)thiswidth=; height=>
image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>
一代理主键的映射
为了保证持久化对象的OID的唯一性和不变性通常有Hibernate或底层数据库来给OID复制因此可以把持久化类的OID的setId()方法设置为Private类型以禁止Java应用程序随便修改OID而把getId()方法设为public类型使得Java应用程序都可以读取持久化对象
在对象关系映射文件中<id>元素用来设置对象标识符例如
j><idname=idtype=longcolumn=ID>
<generatorclass=increment/>
</id>
image onmousewheel=javascript:return big(this) border= alt= src=http://imgeducitycn/img_///jpg width= onload=javascript:if(thiswidth>)thiswidth=; height=>
二自然主键的映射
自然主键是具有业务含义的主键应尽量避免使用自然主键
映射单个自然主键name
j><idname=namecolumn=NAMEtype=string>
<generatorclass=assigned/>
</id>
在以上代码中标识符生成策略为assigned表示有应用程序为name属性赋值
可以使用
j>Customercustomer=newCustomer();
sessiongetIdentifier(customer);
来返回Customer的OID以上返回的是Customer对象的name属性
映射复合自然主键
j><compositeid>
<keypropertyname=namecolumn=NAMEtype=string>
<keypropertyname=companyIdcolumn=COMPANY_IDtype=long>
</compositeid>
j>Customercustomer=newCustomer();
customersetName(Tom);
customersetCompanyId(newLong());
sessionsaveORupadate(customer);//保存和更新指定记录
sessionget(Customerclasscustomer);//获取NAME字段为Tom并且COMPANY_ID字段为的记录
映射复合自然主键的另一种方式为先定义单独的主键类如下
j>packagemypack;
publicclassCustomerIdimplementsjavaioSerializable{
privateStringname;
privateCompanycompany;
publicCustomerId(){
}
publicCustomerId(StringnameCompanycompany){
thisname=name;
pany=company;
}
publicStringgetName(){
returnthisname;
}
publicvoidsetName(Stringname){
thisname=name;
}
publicCompanygetCompany(){
returnpany;
}
publicvoidsetCompany(Companycompany){
pany=company;
}
}
在Customer类中不必定义name和companyId属性而是定义customerId属性
映射代码如下
j><compositeidname=customerIdclass=mypackCustomerId>
<keypropertyname=namecolumn=NAMEtype=string/>
<keypropertyname=companyIdcolumn=COMPANY_IDtype=long></compositeid>
三自然主键(存在外键)的映射
假设上例中COMPANY_ID还作为外键参照COMPANYS表那么Customer类中除了定义customerId属性还必须定义company属性
j>privateCustomerIdcustomerId
privateCompanycompany
映射company属性的代码
j><compositeidname=customerIdclass=mypackCustomerId>
<keypropertyname=namecolumn=NAMEtype=string/>
<keypropertyname=companyIdcolumn=COMPANY_IDtype=long>
</compositeid>
<manytoonename=companyclass=mypackCompanycolumn=COMPANY_IDinsert=falseupdate=false/>
以上<manytoone>元素的insert和update属性都是false表明当Hibernate保存或者更新Customer对象时会忽略company属性
也可以用<keymanytoone>元素来映射company属性
j><compositeidname=customerIdclass=mypackCustomerId>
<keypropertyname=namecolumn=NAMEtype=string/>
<keymanytoonename=companyclass=mypackCompanycolumn=COMPANY_ID/>
</compositeid>