一个数据库表中其主键有可能不止一个属性,同样映射到实体类中,可能有两个或多个属性共同配置成为一个主键,假设一个实体类Score,其主键有两个属性stuId(学生编号)和subjectId(科目编号),在hibernate环境下应该这样配置:
新建一个实体类ScoreId,属性为stuId,和subjectId,该类需要实现serializable接口(最好重写equals方法和hashcode方法):
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;}public ScoreId(int stuId, int subjectId) {super();this.stuId = stuId;this.subjectId = subjectId;}}
新建实体类Score:
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;}public Score(ScoreId scoreId, double result) {super();this.scoreId = scoreId;this.result = result;}}
其次是Score.hbm.xml配置文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.wang.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"></property></class> </hibernate-mapping>
hibernate.cfg.xml这里就省略了,现在新建一个测试类,用于生成数据库表以及向数据库中存放一条数据:
@Testpublic void testCreateDB(){Configuration cfg = new Configuration().configure();SchemaExport se=new SchemaExport(cfg);//第一个参数是否生成ddl脚本 第二个参数是否执行到数据库se.create(true,true);}@Testpublic void testSave(){Session session = HibernateUtil.getSession();Transaction tx = session.beginTransaction();Score s=new Score(new ScoreId(2,5),88);session.save(s);tx.commit();session.close();}