首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

hiberante中施用复合主键

2012-11-20 
hiberante中使用复合主键composite-id?key-property??nameLastname??columnlastname??typestri

hiberante中使用复合主键

<composite-id>
?<key-property
??name="Lastname"
??column="lastname"
??type="string"
?/>
?<key-property
??name="Firstname"
??column="firstname"
??type="string"
?/>
</composite-id>

<property
?name="Age"
?column="age"
?type="integer"
?not-null="false"
?length="10"
/>

</class>

通过composite-id节点声明了一个复合主键,是由“firstname" "lastname"组成。

实体类User中包含了复合主键firstname lastname,hibernate要求复合主键类实现equals hashCode,以作为不同数据间的识别的标志。

public class User implements Serializable{
?private String firstname;
?private String lastname;
?private int age;
?
?public int getAge() {
??return age;
?}
?public void setAge(int age) {
??this.age = age;
?}
?public String getFirstname() {
??return firstname;
?}
?public void setFirstname(String firstname) {
??this.firstname = firstname;
?}
?public String getLastname() {
??return lastname;
?}
?public void setLastname(String lastname) {
??this.lastname = lastname;
?}
?
?public boolean equals(Object obj){
??if(!(obj instanceof User)){
???return false;
??}else{
???User user = (User)obj;
???return new EqualsBuilder().appendSuper(super.equals(obj))
??????.append(this.firstname, user.firstname)
??????.append(this.lastname, user.lastname)
??????.isEquals();
??}
?}
?
?public int hashCode(){
??return new HashCodeBuilder(-528253723, -475504089)
?????.appendSuper(super.hashCode())
?????.append(this.firstname)
?????.append(this.lastname)
?????.toHashCode();
?}
}

EqualsBuilder HashCodeBuilder均为 apache common lang包中的工具类。

对于Session.load方法,我们可将User类对象本身作为查询条件:

User user = new User();
user.setFirstname("hello");
user.setLastname("world");
user = (User)session.load(User.class, user);
System.out.println("age: " + user.getAge());

2)基于主键类的复合主键

我们可以将主键逻辑加以分离,以一个单独的主键类对复合主键进行描述。
现在把User中的firstname lastname提取到一个独立的主键类UserPK中:

public class UserPK implements Serializable{
?private String firstname;
?private String lastname;
?public String getFirstname() {
??return firstname;
?}
?public void setFirstname(String firstname) {
??this.firstname = firstname;
?}
?public String getLastname() {
??return lastname;
?}
?public void setLastname(String lastname) {
??this.lastname = lastname;
?}
?
}

之后修改映射文件的composite-id节点:
<composite-id name="userPk" + user.getAge());

?

来源:http://www.zhuoda.org/irini/73145.html

热点排行