我们遇到了如下所述的 Java EE JPA 映射问题:
1)使用的技术是hibernate(v??可能是2.9或更高版本)和oracle 11G
2)数据库架构师正在执行一个非常常见的数据库结构,类似于以下内容:
COURSE STUDENT_COURSES STUDENT_DETAILS
------ --------------- -------
CR_PK (PK) ST_ID (PK_1, FK_1) ST_ID (PK)
CR_ID (PK_2, FK_2) FIRST_NAME
ROLE LAST_NAME
IS_HAZED
NUM_YEARS
PRESENDENT_IND
DRIVER_LICENSE_NO
3) Java EE 架构师正在实施类似于以下的类层次结构:
Interface StudentService {
Student saveStudent(Student student);
Student getStudent(StudentId id);
void removeStudent(Student student);
Set<RookieStudent> getRookies(int courseId);
Set<SinorStudent> getSeniors(int courseId);
JuniorStudent getStudentBodyPresedent(int courseId) (the result can be a Junior or Senior)
预计将使用将实现上述业务服务接口的任何方法。该界面将最有效地支持 UI 模型已经被我们的业务批准的表示层。其余所需的类层次结构如下:
Class StudentId
int studentId;
int courseId;
Class Student
@embededId
StudentId id
String role;
String first_name;
String last_name;
int num_years;
Class RookieStudent extends Student
boolean isHazed;
Class JuniorStudent extends Student
Boolean isPresendent;
Class SeniorStudent extends JuniorStudent
int age;
String driverLicenseNumber;
4) 学生和子类的大部分详细信息必须来自 STUDENT_DETAILS 表。根据 ROLE 的值,该类将具有该表中的其他属性。例如,如果 ROLE = 'S',则 driverLicenseNumber 将填充 STUDENT_DETAILS.DRIVER_LICENSE_NO 中的值。
我已经为这个模型尝试了各种映射,但是 Hibernate 的实体管理器要么对映射哭泣,要么产生不正确的结果。有没有办法使用 JPA 映射这个模型?我已经尝试使用辅助表的“每个层次结构的单个表”方法,但生成的 Oracle 查询完全错误。使用业务接口获取初中生的查询类似于以下内容:
SELECT c.course_id,
c.student_id,
d.first_name,
d.last_name,
c.role,
d.num_years,
d.presendent_ind,
FROM student_courses c
left outer join student_details d
WITH c.course_id = d.student_id
WHERE c.role = 'J'
很容易看出如何编写正确的查询,但是,Hibernate 正在努力理解我们的要求。如果可能,我们更喜欢使用注释配置。