xml中:
- 新建主键类
// 注意实现序列化,原因a:如果集群中某机器down掉,可能要求把对象写到其他服务器磁盘上;原因b:机器可能使用虚拟内存,将对象写磁盘上
// 注意重写equals hashCode 原因:对象有可能存内存的hash表里,不要hashCode确定位置,需要equals比较对象的一致
public class StudentPK implements Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o){
if(o instanceof StudentPK){
StudentPK s = (StudentPK)o;
if(this.id == s.getId() && this.name == s.getName()){
return true;
}
}
return false;
}
@Override
public int hashCode(){
return this.name.hashCode();
}
}
- 实体中用主键类作为pk
- xml中配置映射
<class name="Student">
<!--联合主键-->
<composite-id name="pk" class="model.StudentPK">
<key-property name="id"></key-property>
<key-property name="name"></key-property>
</composite-id>
<property name="age"/>
</class>
annotation中(3种方式):
1.将组件类注解为@Embeddable,并将组件的属性注解为@Id(不常用)
@Embeddable
public class TeacherPK implements Serializable{...}
public class Teacher {
...
@Id
public TeacherPK getPk() {
return pk;}
...
}
2.将组件的属性注解为@EmbeddedId(第二第三选一种)
public class Teacher {
...
@EmbeddedId
public TeacherPK getPk() {
return pk;}
...
}
3.将类注解为@IdClass,并将该实体中所有属于主键的属性都注解为@Id(第二第三选一种)
@IdClass(TeacherPK.class)
public class Teacher {
...
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...}