2011-10-04 77 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