首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >当父实体和子实体中存在同名属性时,“mappedBy引用未知的目标实体属性”

当父实体和子实体中存在同名属性时,“mappedBy引用未知的目标实体属性”
EN

Stack Overflow用户
提问于 2020-10-14 05:29:25
回答 2查看 674关注 0票数 0

我使用的是SpringBootV1.5.3,当我使用Hibernate继承时,当父实体和子实体中都有同名的属性时,就会发生AnnotationException: mappedBy reference an unknown target entity property

例如:

代码语言:javascript
运行
AI代码解释
复制
Apple => RedApple
      => GreenApple
      => etc.
Tree  => RedAppleTree
      => GreenAppleTree
      => etc.
代码语言:javascript
运行
AI代码解释
复制
// Tree.java

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode(exclude = {"apples"})
@DiscriminatorColumn(name = "colour")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Tree {
    @Id
    @GeneratedValue
    private Long id;
}
代码语言:javascript
运行
AI代码解释
复制
// RedAppleTree.java

@Entity
@Table(name = "tree")
@DiscriminatorValue("RED")
public class RedAppleTree extends Tree {
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "tree")
    private List<RedApple> apples;
}
代码语言:javascript
运行
AI代码解释
复制
// Apple.java

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@DiscriminatorColumn(name = "colour")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Apple {
    @Id
    @GeneratedValue
    private Long id;

    @Enumerated(EnumType.STRING)
    @Column(insertable = false, updatable = false)
    private Colour colour;

    @JoinColumn(insertable = false, updatable = false)
    @ManyToOne
    private Tree tree;
}
代码语言:javascript
运行
AI代码解释
复制
// RedApple.java

@Entity
@Table(name = "apple")
@DiscriminatorValue("RED")
public class RedApple extends Apple {
    @JoinColumn(insertable = false, updatable = false)
    @ManyToOne
    private RedAppleTree tree;
}
代码语言:javascript
运行
AI代码解释
复制
// Colour.java

public enum Colour {
    RED,
    GREEN,
}

Apple.treeRedApple.tree同时存在。在父Apple中,类型是Tree;在子RedApple中,类型是RedAppleTree

现在,当项目运行时,我得到:

代码语言:javascript
运行
AI代码解释
复制
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.example.demo.dao.RedApple.tree in com.example.demo.dao.RedAppleTree.apples
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1628)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject (AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1081)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:856)
    at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:542)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh (EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:737)
    at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:370)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:314)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1162)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1151)
    at com.example.demo.DemoApplication.main (DemoApplication.java:13)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:527)
    at java.lang.Thread.run (Thread.java:834)
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: com.example.demo.dao.RedApple.tree in com.example.demo.dao.RedAppleTree.apples
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass (CollectionBinder.java:769)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass (CollectionBinder.java:719)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass (CollectionSecondPass.java:54)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses (InFlightMetadataCollectorImpl.java:1655)
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses (InFlightMetadataCollectorImpl.java:1623)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete (MetadataBuildingProcess.java:278)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata (EntityManagerFactoryBuilderImpl.java:847)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build (EntityManagerFactoryBuilderImpl.java:874)
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory (SpringHibernateJpaPersistenceProvider.java:60)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean.java:353)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory (AbstractEntityManagerFactoryBean.java:370)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean.java:359)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1687)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1624)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject (AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197)
    at org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1081)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization (AbstractApplicationContext.java:856)
    at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:542)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh (EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:737)
    at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:370)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:314)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1162)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1151)
    at com.example.demo.DemoApplication.main (DemoApplication.java:13)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:566)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:527)
    at java.lang.Thread.run (Thread.java:834)

现在我可以重命名其中一个属性来解决这个问题,但在我正在处理的实际项目中,它会导致更多的更改。

是否可以保持属性名称不变?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-23 14:41:36

在你的父类和子类中复制你的"tree“属性是一个问题。我相信这里的例子会做你想要的。

Tree.java

代码语言:javascript
运行
AI代码解释
复制
@Entity
@Table(name = "tree")
@DiscriminatorColumn(name = "colour")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Tree<APPLE extends Apple> {

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "tree", targetEntity = Apple.class)
    private Set<APPLE> apples = Sets.newHashSet();

    //... getters & setters
}

Apple.java

代码语言:javascript
运行
AI代码解释
复制
@Table(name = "apple")
@Entity
@DiscriminatorColumn(name = "colour")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Apple<TREE extends Tree> {

    @Id
    @GeneratedValue
    private Long id;

    @JoinColumn(name = "tree_id")
    @ManyToOne(targetEntity = Tree.class)
    private TREE tree;

}

RedAppleTree.java

代码语言:javascript
运行
AI代码解释
复制
@Entity
@Table(name = "tree")
@DiscriminatorColumn(name = "colour")
@DiscriminatorValue("RED")
public class RedAppleTree extends Tree<RedApple> {
}

RedApple.java

代码语言:javascript
运行
AI代码解释
复制
@Entity
@Table(name = "apple")
@DiscriminatorColumn(name = "colour")
@DiscriminatorValue("RED")
public class RedApple extends Apple<RedAppleTree> {
}

这将创建以下DB表

代码语言:javascript
运行
AI代码解释
复制
create table tree (
   colour varchar(31) not null,
    id bigint generated by default as identity (start with 1),
    primary key (id)
);
create table apple (
   colour varchar(31) not null,
    id bigint generated by default as identity (start with 1),
    tree_id bigint,
    primary key (id)
)

然后,当我运行以下代码时

代码语言:javascript
运行
AI代码解释
复制
@Test
public void test() {

    RedAppleTree tree = new RedAppleTree();
    session.persist(tree);

    GreenAppleTree greenTree = new GreenAppleTree();
    session.persist(greenTree);

    RedApple apple = new RedApple();
    apple.setTree(tree);
    session.persist(apple);

    tree.getApples().add(apple);
    session.flush();
    session.clear();
    
    tree = session.get(RedAppleTree.class, tree.getId());

    System.err.println(session.createCriteria(RedAppleTree.class).list());
}

这将产生以下SQL (在启用hibernate-sql-logging的情况下运行)

代码语言:javascript
运行
AI代码解释
复制
Hibernate: 
insert 
into
    tree
    (id, version, colour) 
values
    (default, ?, 'RED')
Hibernate: 
insert 
into
    tree
    (id, version, colour) 
values
    (default, ?, 'GREEN')
Hibernate: 
insert 
into
    apple
    (id, version, tree_id, colour) 
values
    (default, ?, ?, 'RED')
Hibernate: 
select
    redappletr0_.id as id2_409_0_,
    redappletr0_.version as version3_409_0_ 
from
    tree redappletr0_ 
where
    redappletr0_.id=? 
    and redappletr0_.colour='RED'
Hibernate: 
select
    this_.id as id2_409_0_,
    this_.version as version3_409_0_ 
from
    tree this_ 
where
    this_.colour='RED'

我相信这应该可以解决你的基本问题。

票数 1
EN

Stack Overflow用户

发布于 2020-10-14 07:47:36

事实是,我从来没有遇到过类似的问题,合乎逻辑的事情,一个好的做法是更改属性的名称,以区分每个属性引用的实体,编译器会告诉您在哪里更改它。

您可以尝试在关系中指定子类,如下所示:

代码语言:javascript
运行
AI代码解释
复制
mappedBy = "tree", targetEntity = RedAppleTree.class

但我重申,最好的选择是更改属性的名称,即使这涉及到更多的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64347162

复制
相关文章
location.hash详解[通俗易懂]
一般情况下为URL后 “#” 及其后面一部分组成,如http://www.test.com/#/something,
全栈程序员站长
2022/09/14
4710
怎么自动刷新jwt?
如果用户一直在操作,当jwt颁发的token凭证到了过期时间需要有一个机制能自动延长过期时间。除非用户长时间没有操作,那是需要强制重新登录的。
蛋蛋编程手记
2022/07/27
3.3K0
自动刷新页面
script> <!--  var limit="0:15" if (document.images){ var parselimit=limit.split(":") parselimit=parselimit[0]*60+parselimit[1]*1 } function beginrefresh(){ if (!document.images) return if (parselimit==1) window.location.reload() else{  parselimit-=1 curmin
张善友
2018/01/19
2.5K0
前端自动刷新工具
Browsersync能让浏览器实时、快速响应您的文件更改(html、js、css、sass、less等)并自动刷新页面。更重要的是 Browsersync可以同时在PC、平板、手机等设备下进项调试。
李维亮
2021/07/09
1.1K0
javascript_时间自动刷新
=========================================================
Hongten
2018/09/13
1.8K0
javascript_时间自动刷新
Weex iOS端的自动刷新和调试
最近开始接触weex。目前weex尚不成熟,官方文档有些粗糙,初学者难免碰壁。这里分享两条我的初学经验,供参考。
全栈程序员站长
2022/07/20
1.2K0
Weex iOS端的自动刷新和调试
为什么你学不会递归?
可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了!
Java3y
2019/11/18
5690
为什么C++不会衰老
Thoughts about C++ in the modern world. 一些关于当代C++的思考。 Debates about the present state of C++ in t
程序员的酒和故事
2018/03/12
9620
为什么C++不会衰老
Python 的切片为什么不会索引越界?
切片(slice)是 Python 中一种很有特色的特性,在正式开始之前,我们先来复习一下关于切片的知识吧。
Python猫
2021/12/20
1.6K0
Python 的切片为什么不会索引越界?
通过MySQL自动同步刷新Redis
在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库。这俩家伙简直可以用“男女搭配,干活不累”来形容,搭配起来使用才能事半功倍。本篇我们就这两者如何合理搭配以及他们之间数据如何进行同步展开。 一般地,Redis可以用来作为MySQL的缓存层。为什么MySQL最好有缓存层呢?想象一下这样的场景:在一个多人在线的游戏里,排行榜、好友关系、队列等直接关系数据的情景下,如果直接
逸鹏
2018/04/11
8K0
通过MySQL自动同步刷新Redis
C语言为什么不会过时?
评价任何一门编程语言,都是招人骂的。永远是这样。就像是春寒料峭的季节,街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做“二逼”现象!
帅地
2020/07/03
1.6K0
为什么你学不会Appium
- 基于webdriver协议,看着眼熟不?没错就是和selenium webdriver同源的机制
苦叶子
2019/09/12
6220
学习分享——location.hash的用法「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 【学习分享】location.hash的用法 location对象:设置或获取当前URL的信息 使用location对象可以设置或返回URL中的一些信息,一个
全栈程序员站长
2022/09/07
8610
为什么C语言不会过时?
评价任何一门编程语言,都是招人骂的。 永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做“二逼”现象!
CSDN技术头条
2019/10/10
9780
为什么C语言不会过时?
为什么C语言不会过时?
来源:赵岩老师的个人网站:http://zhaoyan.website/blog/index.php/2017/07/15/future/
帅地
2019/02/26
1.2K0
你为什么学不会lambda
这个一篇对学习 Lambda 表达式进行解惑的文章,主要是总结了自己在学习 Lambda 表达式时候的一些理解不了的坑进行总结。长篇大论和详细语法,自行谷歌,这里只说一些理解起来不顺的概念。
潇洒
2023/10/20
1070
你为什么学不会lambda
这个一篇对学习 Lambda 表达式进行解惑的文章,主要是总结了自己在学习 Lambda 表达式时候的一些理解不了的坑进行总结。长篇大论和详细语法,自行谷歌,这里只说一些理解起来不顺的概念。
潇洒
2019/07/03
6340
你为什么学不会lambda
SwipeRefreshLayout实现上拉下拉刷新
1:在布局中添加SwipeRefreshLayout和Listview组件 [html] view plain copy <?xml version="1.0" encoding="utf-8
xiangzhihong
2018/02/02
1.1K0
点击加载更多

相似问题

在我的global.asax中,我可以输出当前触发的路由/动作吗?

21

在JavaFX中哪个动作按钮可以触发?

25

我可以在Selenuim中选择动作元素吗?

21

蓝牙可以触发应用程序中的某个动作吗?

20

Memcached是为我准备的吗?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档