我不能 100% 确定这只是一个 Hibernate 问题,因为这可能是一个更抽象的决定,但我会尝试一下。
由于问题描述有点长,我首先声明我想做的是看看是否可以将实现更改为更类似于最佳实践实现的东西。
我有 3 个与此问题相关的实体:工作站 (ws)、员工和组织单位 (org-unit)。
一名员工可以属于一个组织单位。
一个组织单位可以容纳许多员工。
工作站用于显示组织单位(一般)、组织单位及其中的特定员工以及不属于组织单位的员工的数据。
目前,由于种种原因were在我的控制之外,我们不使用 Hibernate 中的实体之间或通过 DB-Constraints 之间的任何关联,但我们只使用逻辑上充当外键的列。
我们目前有一个附加表,有 4 列:Id、WSId、EmployeeId、OrgUnitId。
这允许 WS 引用组织单位(其中 employeeId 为 null)、没有组织单位的员工(orgunitId 为 null)或员工和组织单位(其中都不为 null)。
我希望能够知道:
1.给定一个 WS,它关注哪些员工、哪些组织单位以及如何关注(即单独关注、与员工一起关注?哪个?)
2.给定一名员工,WS 正在监视该员工。
3.给定一个组织单位,哪个 WS 正在监控它以及如何监控(即单独监控、与员工一起监控?哪一个?)
这个问题与表示层有关,因为它指示将生成视图,但它是域模型的一部分,因为用户将使用接口来操作这些监视映射,因此这些映射是域模型的一部分。
我不确定我所拥有的是否不是所有选项中最不邪恶的,我将非常感谢您的评论和建议。
EDIT从答案之一来看,我认为 WS 可以同时以上述类型(组织单位、员工等)的混合形式显示许多此类映射的数据还不够清楚。
好的,我不知道如何在数据库端实现这一点,但这里有一个实体模型,应该涵盖您正在讨论的关系。
Edit:这是针对您的评论的新版本。现在,每个工作站都有 n 个绑定,每个绑定都可以有员工或组织单位或两者(使用数据库约束来确保它们两者都没有)。
您还可以访问每个组织和每个员工的绑定,这将使上述查询变得更加容易:
@Entity
public class OrgUnit{
@OneToMany(mappedBy="orgUnit")
private Set<Binding> bindings;
}
@Entity
public class Employee{
@OneToMany(mappedBy="employee")
private Set<Binding> bindings;
}
@Entity
public class Binding{
@ManyToOne(optional = true)
private Employee employee;
@ManyToOne(optional=true)
private OrgUnit orgUnit;
@ManyToOne(optional=false)
private WorkStation owner;
}
@Entity
public class WorkStation{
@OneToMany(mappedBy="owner")
private Set<Binding> bindings;
}
客户端代码示例:
public Set<WorkStation> getWorkstationsPerEmployee(final Employee employee){
final Set<WorkStation> workStations = new HashSet<WorkStation>();
for(final Binding binding : employee.getBindings()){
WorkStation workStation = binding.getOwner();
if(workStation!=null)
workStations.add(workStation);
}
return workStations;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)