继承问题JPA / Hibernate JOINED

时间:2014-11-07 21:45:18

标签: hibernate java-ee jpa

我想实现这个架构:

enter image description here

我做的是:

对于Person类:

/////***************Class Person ****///////////////
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="role")
    public class Person {
         
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long id;
        private String fName;
        private String lName;
        private String email;
        @OneToMany(fetch = FetchType.EAGER)
        @JoinColumn(name="profil_id")
        private List<Role> listRole;
     
    //getters & setters
    }

对于其他课程,我这样做了(这是Student课程的一个例子,但是对于Teacher和Director课程,它是相同的):

/////***************Class Student ****///////////////
@Entity
@DiscriminatorValue("etudiant")
public class Etudiant {
     
    // other attributes owned to class
 
//getters & setters
}

这是班级角色:

@Entity
public class Role {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long idRole;
    private String roleName;
     //getters & setters
}

系统强制管理员可以创建没有任何角色的人员,将来这个管理员可以影响他们的角色。

下面的代码首次创建一个具有角色学生的人(例如)(这里没有问题):

Student s=new Student("me", "mmm", "me@gmail.com");
m.addPerson(s);// "m" it's a defined variable (used in JUnit test)

此代码的结果是添加student in person表并在学生表中添加他的ID。

我的问题是:

1。如何为人物添加角色?  的 2。如何在添加角色后更改角色(教师==&gt;导演或导演==&gt;教师)?

1 个答案:

答案 0 :(得分:0)

使用JOINED继承,在保留基类条目的同时更改子类类型并不容易,因此您可以简单地使用组合来代替继承。

Person可以与Etudiant有一个@OneToOne(mappedBy)关联,其中Etudiant有一个@OneToOne关联返回Person(FK回到Person的PK)。

Etudiant仍然可以使用继承,因此它可以是StudentPhdStudentTeacherDirector

通过这种方式,您可以轻松地将PersonTeacher转为Director。您只需要更改person.etudiant关联。