繁体   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