代码之家  ›  专栏  ›  技术社区  ›  Ittai

如何用Hibernate实现3对多关系?

  •  2
  • Ittai  · 技术社区  · 15 年前

    我不是100%确定这只是一个休眠问题,因为这可能是一个更抽象的决定,但我会尝试一下。

    我有3个实体,与这个问题相关:工作站(ws)、员工和组织单元(organizationunit)。
    一个员工可以属于一个组织单元。
    一个组织单元可以容纳许多员工。
    工作站用于显示一个组织单元(一般)、一个组织单元和其中某个特定员工的数据以及一个不属于组织单元的员工的数据。

    在我的控制之外,我们不使用Hibernate中实体之间的任何关联,也不使用DB约束,而是使用逻辑上充当外键的列。
    我们目前有一个额外的表,其中有4个列:Id,WSId,EmployeeId,OrgUnitId。
    这允许WS引用组织单元(employeeId为null)、没有组织单元的员工(orgunitId为null)或员工和组织单元(其中没有一个为null)。

    我想知道:
    1.给定一个WS,它跟踪哪些员工,哪些组织单元以及如何跟踪(例如,单独,与一个员工?哪个?)

    3.给定一个组织单元,哪些WS正在监视它,以及如何监视它(例如,单独监视,与员工一起监视)?哪个?)
    这个问题与表示层有关,因为它规定将生成视图,但它是域模型的一部分,作为用户,将使用一个接口来操作这些监视映射,因此这些映射是域模型的一部分。

    我不确定我所拥有的是否是所有选择中最坏的,我将非常感谢您的意见和建议。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Sean Patrick Floyd    15 年前

    好的,我不知道如何在数据库端实现这个,但是这里有一个实体模型,它应该涵盖您所讨论的关系。

    编辑: 这是对你的评论的回应。现在,每个工作站都有n个绑定,每个绑定可以有employee或orgunit,也可以同时有employee或orgunit(使用DB约束确保两者都没有)。

    您还可以访问每个orgunit和每个员工的绑定,这将使上述查询更加容易:

    @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;
    }
    
        2
  •  0
  •   TMN    15 年前

    听起来您真正需要的是Employee-to-OrgUnit上的一个可空FK,以及WS-to-Employee和OrgUnit上的两个可空FK。要查看哪些WS正在监视员工,只需获取所有具有匹配emp\u id列的WS。与WS-monitoringan-OrgUnit相同,可能还有emp\u id为null或不为null的附加规定(取决于您是否需要单独处理这些情况)。不知道“病人”在哪里,你没有透露任何细节。