gpt4 book ai didi

hibernate - 多对多单向映射,只使用两张表

转载 作者:行者123 更新时间:2023-12-04 06:47:09 26 4
gpt4 key购买 nike

我有两个实体:项目、员工

  • 员工有主键 {employeeId} + 一些其他属性
  • 项目有主键 {projectId}

  • 代码:
    public class Employee {
    Long employeeId;
    String name;
    }
    public class Project {
    Long projectId;
    Collection<Employee> employees;
    }

    员工和项目是一种多对多的单向关系。一般的做法是拥有三个表:Employee、Project、EmployeesAssignedToProjects。
    Employee
    ----------
    employeeId (PK)
    name

    Project
    ----------
    projectId (PK)

    EmployeesAssignedToProjects
    ----------------------------
    projectId (FK)
    employeeId (FK)
    {projectId,employeeId} (PK)

    由于 Project 除了其 id 之外没有其他属性,因此 Project 表并不是真正必要的。这带来了一个问题,既然 Project 基本上映射到 EmployeesAssignedToProjects,那么应该如何映射这种多对多关系。

    请注意,Employee 没有指向 Project 的指针。典型的mappedBy 构造不能在这里使用。

    [ - 更新 - ]

    问题有点复杂:Project 和 Employee 都有复合键。
  • 项目的 key 是 {companyId,projectId}
  • 员工的 key 是 {companyId,employeeId}

  • 我采用了3个表的设置。表 PROJECT_EMPLOYEE 有 3 列:companyId、employeeId、projectId。我在 xml 中映射:
    <many-to-many name="PROJECT" >
    <join-table name="PROJECT_EMPLOYEE">
    <join-column name="companyId" referenced-column-name="companyId"/>
    <join-column name="employeeId" referenced-column-name="employeeId" />
    <inverse-join-column name="companyId" referenced-column-name="companyId" />
    <inverse-join-column name="projectId" referenced-column-name="projectId" />
    </join-table>
    </many-to-many>

    我收到一个错误,提示 companyId 出现多次:
    集合映射中的重复列:Project.employees 列:companyId

    最佳答案

    Note that Employee doesn't have a pointer back to Project. The typical mappedBy construct can't be used here.



    这无论如何都无关紧要。

    而事实是所有 ManyToMany关系需要 JoinTable . JoinTable使用 @JoinTable 定义隐式或显式。
    @Entity
    public class Project {
    @Id
    @Column(name="PROJECTID")
    private Long projectId;

    @ManyToMany
    @JoinTable(
    name="PROJECT_EMPLOYEE",
    joinColumns={@JoinColumn(name="PROJECT_PROJECTID", referencedColumnName="PROJECTID")},
    inverseJoinColumns={@JoinColumn(name="EMPLOYEE_EMPLOYEEID", referencedColumnName="EMPLOYEEID")})
    private Collection<Employee> employees;
    ...
    }

    您可以尝试定义 PROJECT表本身为 JoinTable如果您只需要 阅读 支持(我什至不确定它会正常工作)但这不适用于 写道 .

    换句话说,我会坚持使用常规构造来表示数据库中的多对多关系,即使用连接表。

    关于hibernate - 多对多单向映射,只使用两张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3588129/

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