1、编写组合主键的类

  • 该类必须实现Serializable接口;
  • 生成对应的get/set方法;
  • 最好实现equalshashCode方法;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ScoreId implements Serializable{
private int stuId;//学生编号
private int subjectId;//科目编号
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public int getSubjectId() {
return subjectId;
}
public void setSubjectId(int subjectId) {
this.subjectId = subjectId;
}
}

2、在主类中引用对应组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 成绩
* */
public class Score {
private ScoreId scoreId;
private double result;//成绩

public ScoreId getScoreId() {
return scoreId;
}
public void setScoreId(ScoreId scoreId) {
this.scoreId = scoreId;
}
public double getResult() {
return result;
}
public void setResult(double result) {
this.result = result;
}
}

3、映射文件的编写

1
2
3
4
5
6
7
8
9
<hibernate-mapping package="cn.siggy.pojo">
<class name="Score">
<composite-id name="scoreId" class="ScoreId">
<key-property name="stuId"></key-property>
<key-property name="subjectId"></key-property>
</composite-id>
<property name="result"/>
</class>
</hibernate-mapping>

4、测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Test
public void testSave() throws HibernateException{
Session session = null;
Transaction tx = null;
try{
session = HibernateUtil.getSession();
tx = session.beginTransaction();

Score s = new Score();
ScoreId sid = new ScoreId();
sid.setStuId(2);
sid.setSubjectId(6);
s.setResult(89);
s.setScoreId(sid);

session.save(s);

tx.commit();

}catch (HibernateException e) {
if(tx!=null)
tx.rollback();
e.printStackTrace();
throw e;
}finally{
HibernateUtil.closeSession();
}
}