非法尝试映射非集合

时间:2018-01-23 18:51:37

标签: spring hibernate hibernate-mapping

我们最近从Hibernate 3升级到Hibernate 4.3.19.RELEASE并开始了 升级后获得异常。 Spring版本是4。

错误堆栈

... 80 more
Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.markit.bonds.feed.btds.model.BondFeedTraceTrade.pkey
at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:331)
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1922)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:963)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:796)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:3845)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3799)
at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1412)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1846)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1930)
at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:372)
at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:454)
at org.spring

此前工作正常。有人可以指出,如果hibernate在升级时出现此行为的变化。

我在stackoverflow上看到答案,使其收集/设置,然后想知道它是如何工作的。

public class BondFeedTraceTrade {
    @Id
    @GeneratedValue(generator = "hibseq")
    @GenericGenerator(name = "hibseq", strategy = "seqhilo", parameters = {
            @Parameter(name = "max_lo", value = "5"),
            @Parameter(name = "sequence", value = "bond_feed_trace_trade_seq") })
    @OneToMany(targetEntity = BondFeedTrace.class, fetch = FetchType.EAGER, mappedBy = "pkey")
    @Fetch(FetchMode.JOIN)
    private Long pkey;


public class BondFeedTrace {
    @Id
    @GeneratedValue(generator = "hibseq")
    @GenericGenerator(name = "hibseq", strategy = "seqhilo", parameters = {
            @Parameter(name = "max_lo", value = "5"),
            @Parameter(name = "sequence", value = "bond_feed_trace_seq") })
    private Long pkey;
    @Column(name = "CONTRIBUTOR")
    private String contributor;
    @Column(name = "MSGSEQNUM")

感谢。

1 个答案:

答案 0 :(得分:0)

我只能提供几个理由,说明你在Hibernate 3中可以做什么不再有效

JPA 2.0和2.1支持

Hibernate 4.2和4.3分别引入了对JPA 2.0和2.1的支持。 @OneToMany映射是JPA映射,并且随着对新规范的支持,可能围绕这些注释的绑定代码被调整为符合规范要求和使用模式。

因此,根据JPA规范,这意味着您的使用不再有效,以及为什么异常会说明您必须相应地映射您的关联。

Hibernate 3将此作为特殊用例提供这一点似乎也是合理的,事后或通过以后的JPA规范支持所需的开发,它被认为已被弃用,因此被完全删除。

这是一个Bug

用户可以发挥创意,有时他们会发现非常规的做某事的方式,尽管表面看起来有多么奇怪,但它似乎可以工作一段时间,直到代码被重写或替换为新的东西或错误被识别和修复。

无论哪种方式,您的映射都不再有效,您应该对其进行调整。