2015-07-13 3 views
1

Я работаю над проектом JPA, и мне нужна ваша помощь.JPA Аннотации с наследованием

У меня есть два класса: «Человек» и «Лидер», который наследуется от Лица.

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)  
public class Person implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 


    @Column(unique = true)  
    private String personId; 

} 

И

@Entity 
public class Leader extends Person implements Serializable { 

    private List <Person> listTeam; 

    public void addPersonInTeam(Person e) { 

     listTeam.add(e); 
    } 
} 

мой вопрос, нужно ли мне иметь JPA аннотации @OneToMany или что-то еще до частного Список listTeam в классе Лидер?

Большое спасибо

+0

Я предлагаю прочитать это http://stackoverflow.com/questions/2883033/is-it-possible-to-add-jpa-annotation-to-superclass-instance-variables, потому что я вижу гораздо больше проблем чем отсутствие аннотации в списке. Если это не поможет, оставьте заметку. –

+0

Вы имеете в виду, что мне нужно, чтобы Личность была абстрактной? или добавить @MappedSuperClass? Но в этом случае Человек не будет настойчивым, хотя мне нужно, чтобы он был стойким. Большое спасибо за Вашу помощь. – TER

+3

Да, конечно, вам нужна аннотация OneToMany или ManyToMany. Hibernate не угадает, какая ассоциация для вас. –

ответ

2

Вы должны указать отображение между двумя классами, потому что для Hibernate ассоциация не имеет отношения здесь, вы должны использовать аннотаций с обеих сторон, и я думаю, вам нужно OneToMany отображение здесь :

Вот отображение, что вы seraching для:

В Person класса:

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class Person implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column(unique = true) 
    private String personId; 

    @ManyToOne 
    @JoinColumn(name="leader_id") 
    private Leader leader; 
    //getter and setter 

} 

В классе Лидер:

@Entity 
public class Leader extends Person implements Serializable { 

    @OneToMany(mappedBy = "leader") 
    private List <Person> listTeam; 
    //getter and setter 

    public void addPersonInTeam(Person e) { 
     listTeam.add(e); 
    } 
} 

Для получения дополнительной информации вы можете увидеть эти ссылки:

Примечание:

Я не вижу использование поля personId в Person классе, нет необходимости использовать два Differents идентификаторами.

EDIT:

Чтобы ответить на ваши вопросы:

  1. @JoinColumn(name="leader_id") не является обязательным, но он используется для указания имени ключа иностранного.
  2. Если отношение ManyToManymappedBy предназначенный, чтобы уточнить у владельца отношений, то вы можете найти this answer.
+0

Большое спасибо @chsdk, теперь это намного яснее, но у меня есть дополнительные вопросы: 1- @JoinColumn (name = "leader_id") является обязательным в этом случае? Зачем ? 2- если отношение ManyToMany (человек может быть частью команды многих лидеров), сторона, на которую ссылается, не так важна? Независимо от того, работает ли она в Лице или Лидере, (но производительность не будет одинаковой) правильно? 3 - факт, что Человек не является абстрактным классом, совсем в порядке? Большое спасибо – TER

+0

Я отредактировал свой ответ, взгляните. –

+0

Большое спасибо chsdk, это абсолютно ясно о стороне владельца mappedBy, но вы сказали: «Если отношение ManyToMany, свойство mappedBy необязательно»,? Насколько я понимаю, не очень важно, какая сторона является владельцем в случае ManyToMany, но мне нужно выбрать сторону справа? Я имею в виду, если я оставлю только @ManyToMany в обеих сторонах без использования mappedBy, это не будет двунаправленная ссылка? – TER

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