【问题标题】:use the one-to-many or many-to-one使用一对多或多对一
【发布时间】:2026-02-14 23:25:01
【问题描述】:

二类:

部门任务

一个部门可以有很多任务。一项任务只能属于一个部门。

那么使用一对多还是多对一?


one-to-many
class Department{
  private Set tasks;
}
class Task{
  ......
}
//
Department.hbm.xml
....
<set name="tasks">
    <key column="departId" />
    <one-to-many class="Task" />
</set>
.....

多对一

class Department{

}
class Task{
  Department depart;
}
//
Task.hbm.xml
....
<property name="depart">
    <many-to-one class="Department" />
</property>
.....

有什么区别?

顺便说一句,使用集合和列表有什么区别?

以及使用列表的示例(xml配置)?

【问题讨论】:

    标签: hibernate one-to-many many-to-one


    【解决方案1】:

    我想,如果没有部门,任务就不能存在,但部门可以在没有与之关联的任务的情况下存在。因此,依赖于任务将自己附加到部门,因此应该是关系中的拥有方。多对一应该是您的选择。

    【讨论】:

      【解决方案2】:

      您的选择取决于两件事:

      1. 在哪些情况下使用此关系。例如如果您需要按部门列出您的任务,那么您将需要一对多。由于您使用的是 Hibernate,因此加载它们一次也很容易。

      2. 如果您按部门更新任务,那么您也需要其他关系。

      但是,请记住,这些决策深深植根于您的领域模型以及您希望如何构建它。使用这些实体的用例是什么。我强烈建议阅读此SO threadwatch this video by Eric Evans

      希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        只看结构,我会选择多对一。
        如果必须将任务重新分配给另一个部门,则只需更改任务对象,而不需要更改原始部门对象。

        从 java 集合中,Set 不允许重复,而 List 可能

        【讨论】:

        • 但是我必须列出属于指定部门的所有任务,如果使用多对一,可以吗?
        • 当然 sql 将是 select * from task where deparment = &amp;1 将 &1 替换为部门 id 并且您拥有属于该部门的所有任务。
        【解决方案4】:

        您应该定义一个名为 DEPARTMENT_TASKS 的连接表,并在它们之间建立多对多关系。

        【讨论】: