Отображение гибернации: OneToMany и OneToOne для свойства дочернего объекта - PullRequest
6 голосов
/ 04 октября 2011

Вот родительский класс Enterprise. У него есть работодатели, и один из них - президент предприятия.

@Entity
class Enterprise
{
   // fields

   @OneToMany
   public List<Employee> getEmployers()
   // implementation    

   @OneToOne
   public Employee getPresident()
   // implementation

}

Вот дочерний класс Сотрудника. У него есть только информация о предприятии, где он работает. Но вопрос в том, какую ассоциацию я должен использовать?

@Entity
class Employee 
{
   // fields

   // what association should I use?
   public Enterprise getEnterprise()
   // implementation
}

Ответы [ 3 ]

7 голосов
/ 04 октября 2011

Учитывая, что вы определили ассоциацию Enterprise -> Employers с @OneToMany, что означает, что Employer принадлежит только одному Enterprise, вы должны использовать @ManyToOne, что означает, что каждыйEmployer принадлежит макс.1 Enterprise, но Enterprise может ссылаться на многие Employers.

Вы можете определить специфику ассоциации (столбцы соединения и т. Д.) Только на одной из сторон, используя атрибут mapped-by ваннотация:

@Entity
class Enterprise
{
   @OneToMany(mapped-by="enterprise")
   public List<Employee> getEmployers()
   // implementation    

   @OneToOne
   public Employee getPresident()
   // implementation
}

@Entity
class Employee 
{
   @ManyToOne
   @JoinTable ( name="Enterprise", joinColumns={ @JoinColumn(name="ENT_ID", referencedColumnName="ENT_ID") }
   public Enterprise getEnterprise()
   // implementation
}

В случае, если Employer может быть президентом другого Enterprise, в котором он работает (кажется маловероятным, если только вы не можете быть президентом предприятия, не будучи нанятым им),и в случае, если вам нужно было получить доступ к Enterprise, из которых Employer является президентом от Employer, вам необходимо добавить еще одну ассоциацию, в идеале с @OneToOne (вы столкнетесь с проблемами, потому что отношения @OneToOne требуютобе сущности должны иметь одинаковый класс @Id).В этом случае я бы аннотировал метод getPresidedEnterprise() на Employer с @ManyToOne по практическим соображениям.

1 голос
/ 04 октября 2011

У вас должно быть два свойства в классе Employee. Таблица сотрудников должна содержать ссылку на предприятие, а рекламное предприятие - ссылку на сотрудника-президента.

(возможно, вы также можете создать подкласс Employee на основе столбца флага isPresident, но у меня нет такого опыта)

@Entity    
class Enterprise    
{    
    // fields

    @OneToMany(mappedBy="enterprise")    
    public List<Employee> getEmployees(){} 

    @OneToOne
    @JoinColumn(name="PRESIDENT_ID")
    public Employee getPresident(){}
}    

@Entity 
class Employee  
{ 
    // fields

    @ManyToOne
    @JoinColumn(name="ENTERPRISE_ID")
    public Enterprise getEnterprise(){}

    @OneToOne(mappedBy="President")
    public Enterprise getMyEnterprise(){}
} 
1 голос
/ 04 октября 2011

Использовать @ManyToOne аннотацию. Это противоположная сторона отношения один ко многим. В нем говорится, что у сотрудника может быть одно предприятие, но на предприятии может быть много сотрудников.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...