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

时间:2010-08-26 12:20:38

标签: java database hibernate many-to-many

我不是百分之百确定这只是一个Hibernate问题,因为这可能是一个更抽象的决定,但我会试一试。
由于问题描述有点冗长,我首先要说明我想要做的是看我是否可以将实现更改为更符合最佳实践实现的内容。

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

目前,由于 超出我控制范围的各种原因,我们不使用Hibernate中的实体之间的任何关联或通过DB-Constraints,但我们只使用逻辑上充当外键的列。
我们目前有一个附加表有4列:Id,WSId,EmployeeId,OrgUnitId。
这允许WS引用orgunit(其中employeeId为null),没有org-unit(orgunitId为null)的雇员或者雇员和org-unit(其中none都为null)。

我希望能够知道:
1.给出一个WS,员工在跟踪哪个组织以及如何(即,单独与员工一起?哪个?)
2.给予一名员工,WS正在对其进行监控 3.给出一个组织单位,WS正在监督它以及如何(例如,单独与员工一起监督?) 这个问题与Presentation层有关,因为它规定了视图将被生成但它是域模型的一部分,作为用户,将使用,一个接口来操纵这些监视映射,因此这些映射是域模型的一部分。

我不确定我所拥有的东西在选项中是不是最不邪恶的,我会非常感谢您的意见和建议。

编辑从其中一个答案中我认为不清楚WS可以同时显示许多此类映射的数据,在上述各种类型的混合中(组织单位,员工等。)

2 个答案:

答案 0 :(得分:1)

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

修改 这是响应您的评论的新版本。现在每个WorkStation都有n个绑定,每个绑定都可以有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;
}

答案 1 :(得分:0)

听起来你真正需要的是Employee上的一个可空的FK到OrgUnit,以及WS上的两个可空FK到Employee和OrgUnit。要查看哪些WS正在监视员工,只需使用匹配的emp_id列获取所有WS。与监视OrgUnit的WS相同,可能还有一个额外的emp_id为null的规定(取决于你是否需要单独处理这些情况)。不知道“病人”在哪里,你没有提供任何细节。