Hibernate包vs idbag

问题描述 投票:2回答:1

我已经看了一个包和idbag之间的区别,我理解它们之间的区别,但我想要了解的是,如果使用包而不是idbag,反之亦然会有一些情况可能会出错。有人可以用一个例子解释这个。

java hibernate collections orm hibernate-mapping
1个回答
6
投票

Bag是一个无序集合,与idbag不同,它不使用额外的列来存储每个元素索引。

没有像bag工作的用例那样的东西,而idbag则不会。唯一的区别是他们的效率:

  1. Bags are the most efficient inverse collection但他们在单向一对多关联方面表现不佳:

包是最坏的情况,因为它们允许重复的元素值,并且因为它们没有索引列,所以不能定义主键。 Hibernate无法区分重复的行。 Hibernate通过在单个DELETE中完全删除并在更改时重新创建集合来解决此问题。这可能是低效的。

  1. idbag是遗留的hibernate映射,它们用于提供more efficient unidirectional associations alternative

您可以使用JPA @OrderColumn注释定义idbag语义:

@OneToMany(mappedBy = "department")
@OrderColumn(name = "index_id")
private List<Employee> employees;

这样您就可以使用Lists and Sets来订购集合。

因此,尽量保持双向关联,因为它们是最有效的关联,并且它们更好地模仿数据库关系。如果需要某个元素索引策略,请使用@OrderColumn关联。

© www.soinside.com 2019 - 2024. All rights reserved.