加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – org.hibernate.AnnotationException:referencedColumnN

发布时间:2020-12-14 19:28:45 所属栏目:Java 来源:网络整理
导读:我在2个实体之间映射一对一时遇到了以下异常.第一个实体嵌入了复合键.第二个实体也有嵌入式复合键.这些表是遗留系统的一部分.数据持平,关系定义不明确.请帮忙. Caused by: org.hibernate.AnnotationException: referencedColumnNames(FLAG_NAME) of net.java
我在2个实体之间映射一对一时遇到了以下异常.第一个实体嵌入了复合键.第二个实体也有嵌入式复合键.这些表是遗留系统的一部分.数据持平,关系定义不明确.请帮忙.
Caused by: org.hibernate.AnnotationException: referencedColumnNames(FLAG_NAME) of net.javabeat.spring.model.ReferralsM.mnEditFlag referencing net.javabeat.spring.model.MnEditFlag not mapped to a single property
    at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:205)
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:116)
    at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1515)
    at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1440)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1358)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1727)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1778)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBuilder.buildSessionFactory(LocalSessionFactoryBuilder.java:247)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:373)
    at org.springframework.orm.hibernate4.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:358)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
    ... 34 more

这是我在主/父表中的一对一映射.

@OneToOne(targetEntity = MnEditFlag.class,fetch = FetchType.LAZY)
@JoinColumn(name = "REFFLG",referencedColumnName = "FLAG_NAME",insertable = false,updatable = false)
MnEditFlag mnEditFlag;

解决方法

问题的原因是您尝试使用单个连接列,而引用实体的标识由多个列定义.你只需要定义所有需要的连接列,你就可以了:
@JoinColumns({
   @JoinColumn(name = "REFFLG",referencedColumnName = "FLAG_NAME"),@JoinColumn(name = "OTHER_KEY",referencedColumnName = "SOME_OTHER_NAME"))
   ...
})
MnEditFlag mnEditFlag;

OT:您不应该在OneToOne批注上使用targetEntity属性.这已经由目标实体的类型定义:MnEditFlag.您可能只需要对无类型集合使用targetEntity.

编辑:如果只有一个连接列,它只是PK的一部分而你无法更改现有的表,那么你可以定义一个包含所有必要列的新连接表.

然后定义要用于关系的连接表:

@JoinTable(name="ReferralsM_MnEditFlag",joinColumns={
    @JoinColumn(name="REFERRALS_ID1",referencedColumnName="ID1"),@JoinColumn(name="REFERRALS_ID2",referencedColumnName="ID2")
  },inverseJoinColumns={
    @JoinColumn(name="REFFLG",referencedColumnName="FLAG_NAME"),@JoinColumn(name="REFFLG2",referencedColumnName="FLAG_NAME2")
})  
MnEditFlag mnEditFlag;

您必须以编程方式或通过查询将数据迁移到新的连接表.

不幸的是,你无法使用vanilla JPA定义与部分PK的关系,也许Hibernate有这样的功能,比如查询一对一,但我无法确认.

EDIT2:连接表应包含两个实体完全正常运行的所有PK列.这就是为什么我在我的示例中为每一侧定义了两个连接列.列数及其名称纯粹是示例性的.

仅提取表中已有的一个连接列不会添加任何值.

最佳解决方案是更改实体表,以便它们定义实体之间的适当关系.仅更改其中一个表并将其定义为拥有方就足够了,但所有FK列都是如此.这将需要迁移工作,因为您需要为缺少的FK列添加数据,如上所述.

编辑3:我推荐的策略是基于你想要拥有完整的CRUD功能的assubmption.如果您只想提取数据进行显示或报告,那么视图就可以了.您可以定义所需的列,并将整个视图映射到单个实体.但是,由于它是一个视图,您将无法更改数据或迁移它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读