Hibernate映射:子对象属性上的OneToMany和OneToOne

时间:2011-10-04 12:02:17

标签: java hibernate hibernate-mapping

这是父类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
}

3 个答案:

答案 0 :(得分:7)

鉴于您已定义与Enterprise的{​​{1}} - &gt; Employers关联,这意味着@OneToMany只属于一个Employer,你应该使用Enterprise,这意味着每个@ManyToOne都属于最大值。 1 Employer,但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关系要求两个实体具有相同的@Id类。在这种情况下,出于实际原因,我会在@OneToOne上使用getPresidedEnterprise()注释Employer方法。

答案 1 :(得分:1)

使用@ManyToOne注释。这是一对多关系的另一面。它说员工可以拥有一个企业,但企业可以拥有许多员工。

答案 2 :(得分:1)

您应该在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(){}
}