【问题标题】:Hibernate Mapping for interface which extends List扩展列表的接口的休眠映射
【发布时间】:2018-01-09 12:38:48
【问题描述】:

Hibernate 有可能有这样的东西吗:

public interface FooList extends List<Bar> {}

然后使用@OneToMany将其映射到一个类中:

public class Baz {
    @OneToMany
    FooList fooList;
}

当我尝试这样做时,我得到:

非法尝试将非集合映射为@OneToMany、@ManyToMany 或@CollectionOfElements

【问题讨论】:

  • 为什么需要扩展List
  • 你试过简单的List&lt;Bar&gt; fooList;吗?
  • 因为在 Java 中泛型在编译时被删除,但有时有一个精确的类型来推断——在运行时——确实是一个 Bar 的列表,而不仅仅是一个 List (例如,我可以说myMethod(FooList.class),但我不能写myMethod(List&lt;Bar&gt;.class))。这只是为了方便我可能会更改我的代码,但如果它不可能使用休眠。
  • 另请参阅此答案:stackoverflow.com/a/1299345/474034

标签: java hibernate jpa


【解决方案1】:

根据this doc -> link ,只允许一组特定的集合接口。否则需要实现UserCollectionType

Hibernate 使用自己丰富的集合实现 具有延迟加载、缓存或状态变化检测语义。

对于 因此,必须将持久化集合声明为接口 输入。

实际的接口可能是java.util.Collectionjava.util.List、java.util.Set、java.util.Map、java.util.SortedSet、 java.util.SortedMap 甚至其他对象类型(这意味着您将拥有 写一个实现 org.hibernate.usertype.UserCollectionType)。

链接引用了 5.2 版,但这个约束从 3.x 版开始也存在。

【讨论】:

    【解决方案2】:

    来自docs

    作为要求,持久集合值字段必须声明为接口类型。实际的接口可能是 java.util.Setjava.util.Collectionjava.util.Listjava.util .Mapjava.util.SortedSetjava.util.SortedMap 或任何你喜欢的("anything you like" 表示您必须编写 org.hibernate.usertype.UserCollectionType 的实现。

    所以在编写UserCollectionType 的实现之前,您无法映射您的自定义集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 1970-01-01
      • 2012-07-15
      • 2013-11-03
      • 2023-03-14
      • 2013-10-02
      相关资源
      最近更新 更多