如何在JPA中映射自定义集合?
我在使用JPA(Hiberante提供程序)映射自定义集合时遇到问题。例如,当我使用带有属性的对象时
List<Match> matches;
与
<one-to-many name="matches"> <cascade>
<cascade-all />
</cascade>
</one-to-many>
在我的ORM文件中,没关系;但是如果我替换 “列表匹配项”; 通过
private Matches matches;
,其中 “匹配” 的定义如下:
public class Matches extends ArrayList<Match> { private static final long serialVersionUID = 1L;
}
它产生以下错误:
Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: by.sokol.labs.jpa.MatchBox.matches
感谢您的关注!
回答:
可以,但是您必须将其称为常见集合之一- List
或Set
。
所以:
private List matches = new Matches();
为什么?例如,因为Hibernate对您的集合进行代理以启用延迟加载。所以它创建PersistentList
,PersistentSet
并PersistentBag
,这是List
但不是Matches
。因此,如果您想向该集合中添加其他方法,那么就可以了。
查看本文以获取更多详细信息。
但是,您有解决方案。不使用继承,使用组合。例如,您可以向您的实体添加一个方法getMatchesCollection()
(除了传统的getter之外),该方法类似于:
public Matches getMatchesCollection() { return new Matches(matches);
}
您的Matches
课程看起来像(使用google-collections ‘ ForwardingList
):
public class Matches extends ForwardingList { private List<Match> matches;
public Matches(List<Match> matches) { this.matches = matches; }
public List<Match> delegate() { return matches; }
// define your additional methods
}
如果您不能使用Google Collections,只需定义ForwardingList
自己-调用底层的所有方法List
如果不需要任何其他方法来对该结构进行操作,则不要定义自定义集合。
以上是 如何在JPA中映射自定义集合? 的全部内容, 来源链接: utcz.com/qa/408246.html