我们有两张表(一个活动表和一个归档表),它们具有相同的结构(例如
我们有另一个实体/表(例如
是否有方法可以实现我们所尝试的内容或者一个可行的解决方案?
我们已经尝试过各种@
以下是我们基本上要布局的内容:
Employee
和EmployeeArchive
)。为了能够利用共同的代码来使用两个表的结果,我们有一个抽象的父类,定义了所有的方法和注释。我们希望能够执行查询,同时使用两个表相同的查询,并将结果合并在一起。我们有另一个实体/表(例如
Organization
),它与Employee
具有onetomany
/manytoone
双向关系;Organization
拥有Employee
列表,每个员工都属于一个组织。当通过关联获取组织的员工时,我们只想要来自活动表而不是归档表的员工。是否有方法可以实现我们所尝试的内容或者一个可行的解决方案?
我们已经尝试过各种@
MappedSuperclass
,@Entity
/@InheritanceType.TABLE_PER_CLASS
的实现来达到我们的目标。每个实现都接近我们想要的,但却无法完全实现。例如,为了能够查询两个表,我们可以使用带有InheritanceType.TABLE_PER_CLASS
的抽象父Entity
,但是在Organization
中就无法有mappedBy
关系到Employee
。我们可以使用一个MappedSuperclass
作为父类来拥有正确的关系,但是这样我们就无法通过联合查询两个表了。以下是我们基本上要布局的内容:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class AbstractEmployee {
@ManyToOne
@JoinColumn(name="employeeId", nullable=false)
Organization org;
...
}
@Entity
public class Employee extends AbstractEmployee {
}
@Entity
public class EmployeeArchive extends AbstractEmployee {
}
@Entity
public class Organization {
@OneToMany(cascade=ALL, mappedBy="org")
List<Employee> employees;
...
}
代码
public List<AbstractEmployee> getAllEmployees()
{
Query query = em.createQuery("SELECT e FROM AbstractEmployee e where e.name = ‘John’", AbstractEmployee.class);
return query.getResultList();
}
public List<Organization> getOrganizations()
{
Query query = em.createQuery("SELECT e FROM Organization o ", Organization.class);
List<Organization> orgs = query.getResultList();
// fetch or eager fetch the Employees but only get the ones from the active employee table
return orgs;
}
我们还尝试让父类扩展MappedSuperclass
,并将实现和注释放在MappedSuperclass
中,但是我们为Organization
的关系获得了AnnotationException
@MappedSuperclass
public abstract class AbstractMapped {
@ManyToOne
@JoinColumn(name="employeeId", nullable=false)
Organization org;
}
@Entity
@Inheritance(@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS))
public abstract class AbstractEmployee extends AbstractMapped {
... `Constructors` ...
}
在部署时,我们遇到了以下异常:
Caused by org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: Employee.org in Organizaztion.employees
at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:685)