簡體   English   中英

Hibernate映射:子對象屬性上的OneToMany和OneToOne

[英]Hibernate mapping: OneToMany and OneToOne on child object property

這是父類Enterprise。 它有雇主,其中一個是企業總裁。

@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
}

鑒於您已經與@OneToMany定義了Enterprise - > 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總裁(似乎不太可能,除非一個企業的總裁沒有受雇於他),以及如果您需要訪問Employer擔任總裁的EnterpriseEmployer實體中,您需要添加另一個關聯,理想情況下是@OneToOne (您會遇到問題,因為@OneToOne關系要求兩個實體具有相同的@Id類)。 在這種情況下,我會注釋getPresidedEnterprise()的方法, Employer@ManyToOne實際的原因。

使用@ManyToOne注釋。 這是一對多關系的另一面。 它說員工可以擁有一個企業,但企業可以擁有許多員工。

您應該在Employee類上有兩個屬性。 員工表應該引用一個企業,廣告企業應該引用一個員工總統。

(您也可能基於isPresident標志列對Employee進行子類化,但我沒有相關經驗)

@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(){}
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM