hibernate的annotation的文档中提供了三种方法
1 将组件类注解为@Embeddable,并将组件的属性注解为@Id
2 将组件的属性注解为@EmbeddedId (方便)
3 将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id(符合编程习惯)
主键类需要序列化(考虑到可能会将数据读写到虚拟内存中),需要重写hashcode()和equals()方法,因为要对联合主键进行比较.
网络的用法:
@Entity
public class RegionalArticle implements Serializable {
@Id
public RegionalArticlePk getPk() { ... }
}
@Embeddable
public class RegionalArticlePk implements Serializable { ... }
类似继承属性设置
我的用法:
@Entity
@IdClass(value = AdvResourcePK.class)
@Table(name="XXXXX")
public class AdvResource implements Serializable {
private String advId;
private String type;
/**
* @return advId
*/
@Id
@Column(name="adv_id",length=24)
public String getAdvId() {
return advId;
}
/**
* @param advId
*/
public void setAdvId(String advId) {
this.advId = advId;
}
/**
* @return type
*/
@Id
@Column(name="type",length=20)
public String getType() {
return type;
}
...
}
@Embeddable
public class AdvResourcePK implements Serializable{
private String advId;
private String type;
}
也和明显: Po类中@Id了两个属性; PK类中,同时设置2个属性,主要便于查询和保存
查看详情时:
public AdvResource getDetailByAdvResource(String advId,String type){
AdvResourcePK temp =new AdvResourcePK();
temp.setAdvId(advId);
temp.setType(type);
AdvResource temp2 = (AdvResource) get(AdvResource.class, temp);
return temp2;
}
根据PK类来成为唯一键,进行更新和删除都没有问题的;
新增时: 保证两个主键唯一,就可以插入成功了;