2

我已按照本教程来实现我的自定义集合。

我还注释了我的实体的相应属性,如下所示:

  @OneToMany(cascade = ALL, mappedBy = "plan", fetch = EAGER, orphanRemoval = true)
  @CollectionType(type = "my.namespace.MyCustomCollectionType")
  public MyCustomCollection getThings() {
    return things;
  }

但是,在创建映射时,Hibernate 会抱怨:

 Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements

根据Hibernate 文档,这应该没问题。我应该能够在方法签名中使用我的自定义集合,因为我使用了自定义集合类型注释:

实际的接口可能是 java.util.Set、java.util.Collection、java.util.List、java.util.Map、java.util.SortedSet、java.util.SortedMap 或任何你喜欢的东西(“任何你喜欢的东西”意味着您必须编写 org.hibernate.usertype.UserCollectionType 的实现)。

我不知道出了什么问题。

4

1 回答 1

1

好的,我发现了我的问题。

首先,更清楚地说,是的,我有 2 节课。第一个是我的自定义集合(MyCustomCollection),另一个扩展了UserTypeCollectionMyCustomCollectionType),这是 Hibernate 支持自定义集合所需的技术接口。

无论如何,我已经弄清楚出了什么问题:

  • 首先,Hibernate 只支持集合的方法签名中的接口,所以我写了ICustomCollection。然后我需要声明一个PersistentCollection (在我的例子中是PersistentSet),它扩展了这个接口。
  • 然后MyCustomCollectionType应该返回这个自定义的 Persistent Set。

我通过查看 Hibernate 中的测试套件发现了这一点。有几个例子

但遗憾的是,PersistentSet扩展了一个非泛型集合,因此,您也必须声明一个非泛型集合。

这是一个Jira 错误。它已经在这里有一段时间了。

于 2013-07-23T07:52:17.683 回答