Hibernate 创建冗余的多对多表

2023-12-02

在开发 Spring Boot 应用程序时,我必须删除数据库并让 Hibernate 再次生成它hibernate.hbm2ddl.auto=update。之后,我想确保它按照我想要的方式执行所有操作,因此我调用 MySQL Workbench 对我的整个数据库进行逆向工程。当我这样做时,我注意到由于某种原因,我的架构中的表数量是原来的两倍。我的表中有很多实体关系,但它们都是一对多的,但出于某种原因,对于几乎所有的一对多关系,Hibernate 都生成了多对多连接表。这让我感到惊讶,因为以前在同一个 Web 应用程序中没有发生过这种情况。

我对 SO 的搜索只会让我找到this似乎无关紧要的问题。

现在我将提供示例,但我有很多代码,我想保持简短,所以我将只讲一个示例。如果您需要查看更多信息,请在您的答案中注明。

例如,我有这个实体:

@SuppressWarnings("serial")
@Entity
@Indexed
@Table(name = "SKILL")
public class Skill extends AbstractDomainObject {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false)
private long id;

//Some properties

@ManyToOne(fetch = FetchType.EAGER, targetEntity = Skill.class)
@JoinColumn(name = "PARENT", nullable = true)
@Cascade({CascadeType.DETACH}) 
//Cascade annotations are from Hibernate, all else except for 
//"Indexed" are from javax.persistence
private Skill parent;

@OneToMany(fetch = FetchType.EAGER, targetEntity = Skill.class)
@Cascade({CascadeType.DETACH})
private Set<Skill> children;

//Getters, setters, etc
}

您可以看到该实体引用了自身。技能在这里是一棵树。因此,Hibernate 将其解释为:

技能_技能图像

实际上,skill_skill表甚至没有被使用。你可以看到skill没有这个表仍然引用自身。当我在此表中插入新数据时,没有任何新内容出现skill_skill。尽管这两个实体由于某种原因没有获得额外的表:

角色和用户形象

这两个对象在这里具有单边关系:

@SuppressWarnings("serial")
@Entity
@Table(name = "ROLE")
public class Role implements DomainObject {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false)
private long id;

@Column(name = "ROLENAME", nullable = false, length = 50)
private String rolename;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "OWNER", nullable = false)
private User owner;
}

我可以思考的一些原因:

  1. 抽象的AbstractDomainObject超类。它仅具有受保护的样板函数。不过之前并没有造成任何问题。
  2. @Cascade({CascadeType.DETACH})我添加的注释。虽然看起来不太可能。
  3. 我的最后一个更改是我在项目中创建了第二个数据源,这就是我更改我的@EnableAutoConfiguration to @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class})。难道 Hibernate 现在的行为有所不同吗?
  4. 我还将所有造成麻烦的实体移至不同的包。

这里是一个双向关联,双方都是所有者,基本上将其转变为两个独立的关联。在一对多关联中,所有者通常是多对一方(请注意mappedBy属性):

OneToMany(fetch = FetchType.EAGER, targetEntity = Skill.class, mappedBy = "parent")
@Cascade({CascadeType.DETACH})
private Set<Skill> children;

这样,Hibernate 在维护关系时将忽略一对一(并且不会创建连接表,这是默认配置@OneToMany关联无@JoinColumn).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate 创建冗余的多对多表 的相关文章

随机推荐

  • 控制 JsonResult 中的序列化程序,又名 ASP.Net MVC 中的 Json 函数?

    有没有办法配置在控制器中通过 JsonResult 返回 JSON 时使用什么 JSON 序列化器 public ActionResult SomeJsonFunction var x SomeModelCode SomeModelFunc
  • 如何从 Firebase 检索 ListView 中的数据

    你能帮我解决这个问题吗 我尝试在 Listview 中显示 firebase 中的数据 但不显示任何内容 ListView listView FirebaseDatabase firebaseDatabase DatabaseReferen
  • 删除向量每个元素中第二次出现“-”之后的所有字符

    我想删除向量的每个元素中第二次出现 之后的所有字符 Initial string aa bbb cccc gt aa bbb aa vvv vv gt aa vvv aa ddd gt aa ddd 有什么帮助吗 根据示例输入和预期输出判断
  • 如何缩放和设置MediaView的坐标?

    我想在我的 JavaFx 2x 场景中嵌入一个视频 并根据我的需要调整它的大小和位置 我遇到的问题如下 如果我建立一个MediaView组件然后平移X或Y坐标 然后整个视图就被正确移动像这样 MediaView mv mv setTrans
  • 显示 Oracle SQL 中表的所有约束的名称

    我已经为在 Oracle SQL 中创建的多个表的每个约束定义了一个名称 问题是 要删除特定表的列的约束 我需要知道为每个约束提供的名称 但我已经忘记了 如何列出为表的每一列指定的所有约束名称 有没有这样的SQL语句 您需要查询数据字典 具
  • 使用 Powershell 删除 csv 文件末尾的空行

    我需要使用 Powershell 删除 CSV 文件末尾的空行 我尝试了下面的代码 此代码仅用于删除下面示例文件图像中的第 7 行和第 8 行 但我需要删除第 3 4 5 6 7 和 8 行 只有第 2 行有数据 任何建议将不胜感激 谢谢
  • 从另一个 js 文件导入函数。 JavaScript

    我有一个关于在 javascript 中包含文件的问题 我有一个非常简单的例子 gt index html gt models gt course js gt student js 课程 js function Course this id
  • 如何在c# Microsoft graph api请求中获取响应标头

    我正在尝试做文件复制使用 Microsoft graph API 在 c net core 中进行操作 这是一个异步操作 根据文档 它说它返回一个位置响应头检查操作的状态 现在的问题是我需要它的响应标头 以便我可以检查文件复制操作的状态 但
  • 合并两个图像 --> 4 倍大小!如何减小文件大小?

    我使用下面的代码合并两个图像 一张不透明的基础图像 一张透明的覆盖图像 其拥有的图像文件大小分别为 20kb 和 5kb 合并两个图像后 生成的文件大小 gt 100kb 因此至少是 25kb 组合大小的 4 倍 我预计文件大小小于 25k
  • 错误2 系统找不到Sublime Text 2、Windows 8中指定的文件

    刚刚安装了 Sublime Text 2 尝试构建 hello world 程序 并收到以下消息 Error 2 The system cannot find the file specified cmd u g u u o u dir C
  • Facebook 评论插件 - 每个页面上都有相同的评论

    我网站上的 Facebook 评论效果很好 但当有人对一篇文章发表评论时 网站上的每篇文章都会出现 相同的评论 显然 我不希望这样 我所做的基本上是复制并粘贴在developers facebook com上提供的代码 div div
  • 如何在Python极坐标中添加持续时间到日期时间

    我想在日期 时间中添加以秒为单位的持续时间 我的数据看起来像 import polars as pl df pl DataFrame dt 2022 12 14T00 00 00 2022 12 14T00 00 00 2022 12 14
  • Python 入门:属性错误

    我是 python 新手 今天刚刚下载 我正在使用它来处理网络蜘蛛 因此为了对其进行测试并确保一切正常 我下载了示例代码 不幸的是 它不起作用并给了我错误 AttributeError MyShell 对象没有属性 已加载 我不确定代码本身
  • 通过 VSTS CI/CD 升级 Azure Service Fabric 时出错

    我正在使用 VSTS 来设置 CI CD 以进行服务结构构建和部署 第一次部署没有错误 但第二次更新部署给出了以下错误 ConfigPackage中的内容名称 Config 版本 1 0 0 20180312 1 服务清单中的 Sample
  • 苹果手表上的图像

    昨天我的申请被拒绝时遇到了一个问题 显然 这些图像并未显示在实际的 Apple Watch 上 但它们显示在模拟器中 我什至尝试重置模拟器 但无法复制苹果员工发生的问题 所以我只是想知道在苹果手表上添加 显示图像的正确方法是什么 这样它们才
  • spring jpa hibernate 具有更多数据源

    我必须在我的应用程序 spring 中使用两个不同的数据库和 Hibernate Jpa 我想直接为不同的数据源定义不同的表 所以我使用两个不同的持久性单元并尝试使用
  • OpenTsdb:度量和标签信息中是否允许空格字符

    我正在使用 openTsdb 并遇到了度量 标记 tagk 甚至值 tagv 中不允许空格字符的问题 有什么方法可以至少在标签的值中添加空格吗 我还提到 http opentsdb net docs build html user guid
  • Angular 通用服务器端渲染、元标签

    我将网站移至 Angular 通用 SSR 在我搬家的过程中 我遇到了一些问题 我认为 ng universal 可以解决这些问题 我想添加元标记 例如描述 关键字等 每个页面不同 使用titleService正如 Angular 所建议的
  • Unity3d - eulerAngles(本地和全局)与检查器中的完全不同

    在游戏对象的检查器中 我使用的起始旋转是 90 但是当我运行时print transform eulerAngles x 我得到 270 同上transform localEulerAngles x 如果我倾斜gameObject向下 检查
  • Hibernate 创建冗余的多对多表

    在开发 Spring Boot 应用程序时 我必须删除数据库并让 Hibernate 再次生成它hibernate hbm2ddl auto update 之后 我想确保它按照我想要的方式执行所有操作 因此我调用 MySQL Workben