Hibernate 返回 PersistentBag 而不是 List

meG*_*ind 5 spring hibernate jpa spring-data-jpa spring-boot

我有以下关系 bw 下面给出的两个实体,当我从存储库中获取 OutletProductVariety 对象时,即使在使用 fetchtype Eager 之后,价格也会出现在 PersistentBag 中,而不是作为列表。

@Entity
public class OutletProductVariety  {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  Long id;

  @ManyToOne
  @JoinColumn(name = "varietyId")
  Variety variety;

  @OneToMany(mappedBy = "outletVariety", fetch = FetchType.EAGER)
  List<Price> price;
}
Run Code Online (Sandbox Code Playgroud)

@Entity
public class Price {

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  Long Id;

  @ManyToOne
  @JoinColumn(name="outletVareityId")
  private OutletProductVariety outletVariety;

  private Double price;
}
Run Code Online (Sandbox Code Playgroud)

如何获得价格列表而不是 PersistentBag?

mrk*_*nic 5

看看 Hibernate PersistentBag

可以多次包含相同元素的无序、无键集合。奇怪的是,Java 集合 API 没有 Bag。大多数开发人员似乎都使用 List 来表示包语义,因此 Hibernate 遵循这种做法。

public class PersistentBag extends AbstractPersistentCollection implements List

protected List bag;
Run Code Online (Sandbox Code Playgroud)

它实现java.util.List;所以它基本上是一个List并在内部包装你的 List

这只是表示您的列表的 Hibernates 方式。

  • 但请注意,PersistentBag 违反了 `equals` 的约定,因此 `normalList.equals(persistentBagList) =&gt; true` 但 `persistentBagList.equals(normalList) =&gt; false` https://hibernate.atlassian.net/browse/ HHH-5409 (5认同)