2011-10-04 64 views
4

這裏是父類Enterprise。它有僱主,其中之一是企業總裁。Hibernate映射:子對象屬性上的OneToMany和OneToOne

@Entity 
class Enterprise 
{ 
    // fields 

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

    @OneToOne 
    public Employee getPresident() 
    // implementation 

} 

這裏是孩子Employee類。它只有關於他工作的企業的信息。但問題是我應該使用哪種關聯?

@Entity 
class Employee 
{ 
    // fields 

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

爲什麼不OneToOne? –

+2

@Nathan - 因爲在一個企業裏可以有很多員工,而不僅僅是一個。 –

回答

7

既然你已經定義了Enterprise - 與@OneToMany>Employers關聯,這意味着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總裁(他似乎不太可能,除非可以成爲企業的總裁而不受僱用),並且如果您需要訪問其中EmployerEmployer實體的總裁的Enterprise,則需要添加另一個關聯,理想情況下與@OneToOne(你會遇到問題,因爲@One ToOne關係要求兩個實體具有相同的@Id類)。在這種情況下,我會注意EmployergetPresidedEnterprise()方法與@ManyToOne出於實際的原因。

+0

但總統領域呢?我應該使用OneToOne關聯,但employee.enterprise註釋與ManyToOne ... –

+1

@Artyom - 他們沒有連接。不會有問題。總統是一個不同的專欄。 –

+1

如果僱主可以擔任他所僱用的不同企業的總裁,這隻會是一個問題。只有在這種情況下,如果你想從僱主實體訪問僱主是總裁的企業,則需要添加另一個關聯,理想情況下使用@OneToOne(您會遇到問題,因爲@ OneToOne關係需要兩個實體擁有相同的@ Id類)。 –

1

使用@ManyToOne註解。這是一對多關係的另一面。它說一個員工可以有一個企業,但一個企業可以有很多員工。

+0

但是一個企業有很多僱主,這是一對多的協會。而一名員工是企業總裁 - 這是onetoOne協會 –

+0

@Artyom - 是的,使用'@ ManyToOne'。我以前沒有正確閱讀過你的問題。 –

1

您應該在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(){} 
} 
+0

但是,對於非總裁僱主,現場getMyEnterprise有何意義?它會返回空值嗎? –

+0

@ OneToOne映射在所有情況下都不起作用,至少在Hibernate中是這樣,因爲'Employer'和'Enterprise'的'@ Id'映射預計是相同的類型。 –

+0

它_should_返回null :)。或者你可以讓關係單向。另外,請考慮哈維關於id類型的說法。 – alh84001

相關問題