0

我们遇到了如下所述的 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 正在努力理解我们的要求。如果可能,我们更喜欢使用注释配置。

4

1 回答 1

0

忽略 JPA,您尝试做的事情在 Java 中没有意义。如果您的学生去不同的班级,大概学生在新班级中的角色可能会有所不同:大三学生可能会变成大四学生。您不能只使用 Java 对象切换角色更改 - 您必须创建一个全新的学生实例。正如 JB 建议的那样,使每个表成为一个实体。然后,您可以使用 student_course 实体作为包装器来访问 Student 中适合学生在该班级中的角色的属性。JuniorRole 类型只会公开您打算在 JuniorStudent 中存在的字段。

Role 类将使用仅包含 OneToOne 到 course 和 OneToOne 到 studentdetails 的单表继承,并使用角色作为类型鉴别器。然后访问器方法将访问 studentDetails,当您创建新角色时,它可以重用现有的 studentDetails。因此,多个课程可以让同一个学生以不同的角色注册,而不必在 student_details 表中重复条目。

于 2013-07-18T15:33:57.450 回答