gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:45:34 25 4
gpt4 key购买 nike

我不是 100% 确定这只是一个 Hibernate 问题,因为这可能是一个更抽象的决定,但我会试一试。
由于问题描述有点冗长,我首先声明我想做的是看看我是否可以将实现更改为更类似于最佳实践实现的东西。

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

目前,由于各种我无法控制的原因,我们不使用 Hibernate 中实体之间的任何关联或通过 DB-Constraints,但我们只使用逻辑上用作外键的列.
我们目前有一个包含 4 列的附加表:Id、WSId、EmployeeId、OrgUnitId。
这允许 WS 引用一个组织单位(其中 employeeId 为空)、一个没有组织单位的雇员(orgunitId 为空)或一个雇员和组织单位(其中没有一个为空)。

我想知道:
1.给定一个 WS,它跟随哪些员工以及哪些组织单位以及如何(即,独自一人,与一名员工一起?哪个?)
2.给定一个员工,哪个WS正在监控它。
3.给定一个组织单位,哪个 WS 正在监控它以及如何监控它(即,单独,与员工?哪个?)
这个问题与表示层有关,因为它指示将生成 View ,但作为用户,它是域模型的一部分,将使用一个接口(interface)来操作这些监视映射,因此这些映射是域模型的一部分。

我不确定我所拥有的是否是选项中最不邪恶的,我将不胜感激评论和建议。

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

最佳答案

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

编辑:这是响应您的意见的新版本。现在每个 WorkStation 都有 n 个绑定(bind),每个绑定(bind)都可以有员工或组织单位或两者都有(使用数据库约束来确保它们两者都没有)。

您还可以访问每个组织单位和每个员工的绑定(bind),这应该会使上述查询更容易:

@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;
}

关于java - 如何与 Hibernate 实现 3 多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3574975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com