使用 joinColumn 而不是 mappedBy 有啥危害?

Posted

技术标签:

【中文标题】使用 joinColumn 而不是 mappedBy 有啥危害?【英文标题】:What harm does using joinColumn instead of mappedBy do?使用 joinColumn 而不是 mappedBy 有什么危害? 【发布时间】:2015-09-12 14:34:25 【问题描述】:

我了解 JoinColumn 和 mappedBy 的两个 JPA 注释之间的一般区别,并且 oneToMany 关系应该使用 mappedBy。我知道这是为了确保 hibernate(或我正在使用的任何 JPA 工具)识别双向关系,而不是碰巧共享列的两个单向关系。

但是,我想更好地理解为什么这很重要?我认为识别双向关系可以更优化地存储或获取数据,但有人可以给我一个例子吗?如果我有一个包含许多子对象的父对象,并且我使用 JoinColumn 而不是首选的 mappedBy 对其进行注释,那么使用 mappedBy 我会在哪里遭受性能损失?

【问题讨论】:

【参考方案1】:

我在练习 @joincolumn 和 mappedBy 两者,这是我在分析休眠日志时发现的。

使用 mappedBY

执行保存操作

当您使用 mappedBy 创建实体时,您也在子对象中创建父对象,然后执行保存操作。 hibernate 在后台做了什么:-

    对父对象执行插入操作 对子对象执行插入操作。此时设置父对象的外键引用 仅插入

使用 @JoinColumn

执行保存操作

当您使用@JoinColumn 创建实体时,您不会在子对象中创建父对象。 hibernate 在后台做了什么:-

    对父对象执行插入操作 对子对象执行插入操作 执行单独的更新操作以更新所有子对象上的外键引用

您可以在休眠日志中看到这些操作。

基本上@JoinColumn 与 mappedBy 执行相同的工作,但需要额外的更新操作。 所以,mappedBy 的性能肯定比@JoinColumn 好。

但是,如果您创建一个或两个实体,它不会影响,但如果我们必须创建大量数据,它肯定会导致显着的性能问题。

【讨论】:

【参考方案2】:

这个答案应该是评论,但我不能添加评论,因为我没有足够的声誉。参考JPA JoinColumn vs mappedBy

【讨论】:

我已经通读了所有这些。它没有解决我的问题。我了解 JPA 是如何解释这两者的,但我不知道这实际上对性能有什么影响。在发布这篇文章之前,我已经彻底阅读了链接的帖子,以确保它没有解决我的问题。

以上是关于使用 joinColumn 而不是 mappedBy 有啥危害?的主要内容,如果未能解决你的问题,请参考以下文章

jpa hibernate @OneToOne @JoinColumn referencedColumnName 被忽略

我啥时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?

仅使用 @mappedBy ,不使用@JoinColumn - 在 OneToMany 关系中创建的连接列,那么 JoinColumn 的用途是啥?

我可以在@OneToMany 上使用@JoinColumn 吗?

什么是 @JoinColumn 以及它在 Hibernate 中的使用方式

@joincolumn 的休眠默认值