这是父类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
}
答案 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(){}
}