我们最近从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")
感谢。
答案 0 :(得分:0)
我只能提供几个理由,说明你在Hibernate 3中可以做什么不再有效
Hibernate 4.2和4.3分别引入了对JPA 2.0和2.1的支持。 @OneToMany
映射是JPA映射,并且随着对新规范的支持,可能围绕这些注释的绑定代码被调整为符合规范要求和使用模式。
因此,根据JPA规范,这意味着您的使用不再有效,以及为什么异常会说明您必须相应地映射您的关联。
Hibernate 3将此作为特殊用例提供这一点似乎也是合理的,事后或通过以后的JPA规范支持所需的开发,它被认为已被弃用,因此被完全删除。
用户可以发挥创意,有时他们会发现非常规的做某事的方式,尽管表面看起来有多么奇怪,但它似乎可以工作一段时间,直到代码被重写或替换为新的东西或错误被识别和修复。
无论哪种方式,您的映射都不再有效,您应该对其进行调整。