用Java持久层框架来操作数据库时,复合主键是常见的需求。这篇文章将详细阐述javax.persistence复合主键的实现方式,并提供完整的示例代码。
一、复合主键的定义
复合主键是指数据库表中的主键由多个字段组合而成,而不是由单一字段组成。在Java持久层框架中,我们可以使用javax.persistence.IdClass或者javax.persistence.EmbeddedId注解来实现复合主键。
二、使用javax.persistence.IdClass注解实现复合主键
使用javax.persistence.IdClass注解实现复合主键,需要创建一个表示复合主键的类和一个表示数据库实体的类。复合主键的类需要实现java.io.Serializable接口,并重写equals和hashCode方法。
1、复合主键的类
/** * 复合主键的类 */ public class StudentCoursePK implements Serializable { private static final long serialVersionUID = 1L; private Integer studentId; private Integer courseId; //省略get/set方法和equals/hashCode的重写 }
2、数据库实体的类
/** * 数据库实体的类 */ @Entity @IdClass(StudentCoursePK.class) public class StudentCourse { @Id private Integer studentId; @Id private Integer courseId; private String score; //省略get/set方法 }
三、使用javax.persistence.EmbeddedId注解实现复合主键
使用javax.persistence.EmbeddedId注解实现复合主键,直接在数据库实体类中定义复合主键。
1、复合主键的类
/** * 复合主键的类 */ @Embeddable public class StudentCoursePK implements Serializable { private static final long serialVersionUID = 1L; private Integer studentId; private Integer courseId; //省略get/set方法和equals/hashCode的重写 }
2、数据库实体的类
/** * 数据库实体的类 */ @Entity public class StudentCourse { @EmbeddedId private StudentCoursePK id; private String score; //省略get/set方法 }
四、复合主键的查询
在使用复合主键的类进行查询时,需要使用javax.persistence.EntityManager.find方法或javax.persistence.Query.getSingleResult方法,并将复合主键的对象作为参数传入。
/** * 查询复合主键的方法 * @param entityManager * @param studentId * @param courseId * @return */ public StudentCourse queryStudentCourse(EntityManager entityManager, Integer studentId, Integer courseId){ StudentCoursePK pk = new StudentCoursePK(); pk.setStudentId(studentId); pk.setCourseId(courseId); return entityManager.find(StudentCourse.class, pk); }
五、小结
本文中介绍了使用javax.persistence.IdClass和javax.persistence.EmbeddedId注解实现复合主键的方法,并提供了完整的示例代码。希望这篇文章能帮助大家了解Java持久层框架中复合主键的实现方式。