如何使用休眠 JPA 注释映射嵌套集合 Map<Key< List<Values>>?

2022-09-03 15:18:32

我有一个课程,我不确定如何正确注释。

我对Holder::d ata的目标:

  • List 不应通过比较器来维护顺序,而应通过数组中元素的自然排序来维护顺序。(如果有帮助,它可以是ndx列。
  • 持有者将拥有对数据的唯一引用,因此Cascade all可能也适用。

我也对删除地图的不同设计持开放态度,如果这样可以进行更干净的设计。

@Entity
public class Holder extends DomainObject {
  private Map<Enum,List<Element>> data;
}

@Entity
public class Element extends DomainObject {
  private long valueId;
  private int otherData;
}

@Mappedsuperclass
public class DomainObject {
 // provides id
 // optimistic locking
 // create and update date
}

答案 1

我不认为使用hibernate(-core)可以映射任何集合集合:

集合可以包含几乎任何其他 Hibernate 类型,包括所有基本类型、自定义类型、组件,当然还有对其他实体的引用。

(来自官方文档)

请注意集合类型的几乎和省略。

解决方法:您需要在集合持有者和元素之间引入一个新类型。此类型可以映射为实体或组件,它引用映射的原始内容,在本例中为列表。

像这样:

@Entity
public class Holder extends DomainObject {
  @OneToMany
  private Map<Enum,InBetween> inBetweens;
}

@Entity
public class InBetween extends DomainObject {
  @OneToMany
  private List<Element> elements;
}

@Entity
public class Element extends DomainObject {
  private long valueId;
  private int otherData;
}

@Mappedsuperclass
public class DomainObject {
 // provides id
 // optimistic locking
 // create and update date
}

映射的其余部分取决于您的特定情况,但相当简单。


答案 2

这是一个关于休眠 http://blog.xebia.com/2007/10/05/mapping-multimaps-with-hibernate/

希望它会有所帮助。它帮助了我。

问候, 安东