2014-11-07 3 views
1

Я хочу реализовать эту схему:Проблема наследования JPA/Hibernate JOINED

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 
    } 

Для другого класса я сделал это (это пример для Студенческого класса, однако для классов Учителя и директора это то же самое):

/////***************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", "[email protected]"); 
m.addPerson(s);// "m" it's a defined variable (used in JUnit test) 

Результаты этого кода является добавление студента в лицо таблицы и добавить его идентификатор в таблице учеников.

Мои вопросы:

1. Как я могу добавить роль человека? 2. Как я могу изменить роль (учитель ==> Директор или директор ==> Учитель) после добавления ролей?

+0

Очень хороший вопрос. Я планирую написать статью на эту тему на моем [Hibernate Master Class] (http://vladmihalcea.com/tutorials/hibernate/) бесплатном учебном курсе в режиме онлайн. –

ответ

0

С наследованием JOINED изменить тип подкласса нелегко, сохранив запись базового класса, поэтому вместо наследования вы можете просто использовать композицию.

У человека может быть ассоциация @OneToOne(mappedBy) с Этудиантом, где у Этудианта есть ассоциация @OneToOne, обращенная к Человеку (FK возвращается к ПК человека).

Etudiant все еще может использовать наследование, так что это может быть Student, PhdStudent, Teacher, Director.

Таким образом, вы можете легко повернуть один Person от Teacher до Director. Вам просто нужно изменить ассоциацию person.etudiant.

Смежные вопросы