Hibernate/JPA中涉及继承时如何指定列名?

2024-04-15

我想我想在这里鱼和熊掌兼得,但我们会看看是否有一个合理的解决方案来满足我正在寻找的问题。我有一个 Spring Boot/JPA/Hibernate 应用程序,它将与 MySQL 作为其后备存储进行通信。我有几种情况,从 OOP 的角度来看,我的实体类形成了一个父/子层次结构,如下所示:

// Groovy pseudo-code!
class Vehicle {
  Long id
  Long maxSpeed
  String make
  String model
}

class Motorcycle extends Vehicle {
  Boolean isTwoStroke
}

class Car extends Vehicle {
  Boolean hasLeatherInterior
}

通常,在 JPA 之外,我可能会像这样设计各自的表:

CREATE TABLE motorcycles (
  motorcycle_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  motorcycle_max_speed BIGINT UNSIGNED,
  motorcycle_make VARCHAR(50) NOT NULL,
  motorcycle_model VARCHAR(50) NOT NULL,
  motorcycle_is_two_speed BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

CREATE TABLE cars (
  car_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  car_max_speed BIGINT UNSIGNED,
  car_make VARCHAR(50) NOT NULL,
  car_model VARCHAR(50) NOT NULL,
  car_has_leather_interior BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

Ideally我想保持这个表的设计不变,“父车辆”列的名称与我上面的完全相同。但如果我正确理解 Hibernate/JPA API,那么我就不会think无需做出某种牺牲,这是可能的。我认为我要么需要牺牲应用程序层的继承,以便我可以完全按照数据库中的名称命名子类中的列:

@Entity
class Motorcycle {    // No longer extends Vehicle :-(
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name = "motorcycle_id")
  Long id

  @Column(name = "motorcycle_max_speed")
  Long maxSpeed

  @Column(name = "motorcycle_make")
  String make

  @Column(name = "motorcycle_model")
  String model

  @Column(name = "motorcycle_is_two_speed")
  Boolean isTwoStroke
}

@Entity
class Car {    // No longer extends Vehicle :-(
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name = "car_id")
  Long id

  @Column(name = "car_max_speed")
  Long maxSpeed

  @Column(name = "car_make")
  String make

  @Column(name = "car_model")
  String model

  @Column(name = "car_has_leather_interior")
  Boolean hasLeatherInterior
}

Or我认为我可以保留应用程序层继承,但随后需要重构我的数据库表,如下所示:

CREATE TABLE motorcycles (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  max_speed BIGINT UNSIGNED,
  make VARCHAR(50) NOT NULL,
  model VARCHAR(50) NOT NULL,
  motorcycle_is_two_speed BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

CREATE TABLE cars (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  max_speed BIGINT UNSIGNED,
  make VARCHAR(50) NOT NULL,
  model VARCHAR(50) NOT NULL,
  car_has_leather_interior BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

所以我问:我是否可以保留我的应用程序层继承(并且有Motorcycle and Car继承这些属性Vehicle) and使用我的首选约定来命名我的数据库表列?


可以使用 @MappedSuperclass (Designates a class whose mapping information is applied to the entities that inherit from it. A mapped superclass has no separate table defined for it.) 车辆类别:

@MappedSuperclass
public class Vehicle {
    @Id
    @GeneratedValue
    Long id;
    Long maxSpeed;
    String make;
    String model;
}

摩托车小类

 @Entity
    @AttributeOverrides({
            @AttributeOverride(name = "id", column = @Column(name = "motorcycle_id"))
    })
    public class Motorcycle extends Vehicle {
        Boolean isTwoStroke;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate/JPA中涉及继承时如何指定列名? 的相关文章

随机推荐

  • 基准和处理时间结果的差异

    我一直在尝试对替换数据框中的 NA 的最有效方法进行一些测试 我首先在 100 万行 12 列的数据集上比较 NA 与 0 的替换解决方案 把所有有管道能力的都扔进去microbenchmark我得到以下结果 问题一 有没有办法测试子集左赋
  • Oracle查询将多列转换为一列

    我的表中有 50 列 它只返回一行 我希望 50 列的一行显示为 50 行和 1 列 任何人都可以建议我使用 Oracle 查询吗 您可以使用UNPIVOT对于像这样的一行 仅获取包含值的列 SELECT colvalue FROM SEL
  • 在单独的 cpp 文件中进行 Boost 单元测试

    我想将 Boost 单元测试分成单独的 cpp 文件 例如 Test1 cpp Test2 cpp Test3 cpp 等 这样我就不会在单个 cpp 文件中包含 1000 个测试 到目前为止 当我尝试构建时 我遇到了各种错误 测试1 cp
  • 节或组名称“oracle.manageddataaccess.client”已定义

    将 Oracle ManagedDataAccess dll 从版本 4 121 1 0 更新到版本 4 121 2 0 后 由于我无法使用 NHibernate 保存先前版本中 CLOB 类型的值 因此在客户端计算机上出现以下错误 Sys
  • 使用马哈拉诺比斯距离进行多变量离群值去除

    我的数据有异常值 我怎样才能找到马哈拉诺比斯距离 并用它来删除异常值 首先让我提出一些一般准则 实际上 如果你有很多特征和较少的样本 马哈拉诺比斯算法往往会给出误导性的结果 你可以自己尝试一下 所以你拥有的特征越多 你应该提供的样本就越多
  • 埃拉托色尼真筛——用于生成素数的算法

    今天读到一篇论文 奥尼尔 梅丽莎 E 正版 埃拉托斯特尼筛法 http www cs hmc edu oneill papers Sieve JFP pdf杂志 函数式编程 已出版 剑桥大学出版社在线 2008 年 10 月 9 日 doi
  • Spring Social NoSuchMethodError SocialAuthenticationFilter.getFilterProcessesUrl()

    我使用Spring Security登录 现在我正在尝试添加 spring 社交 facebook 登录 但我收到很多错误信息 首先 当我尝试使用相同的方法时春季社交指南 http spring io guides gs accessing
  • Hibernate 4.3.5 不适用于 Oracle10g 数据库

    我正在尝试使用 Hibernate 4 3 5 和 Oracle 数据库 但在运行过程中我遇到了以下问题 相同的代码在 MySQl 数据库中运行良好 org hibernate engine jdbc connections interna
  • Java 中 C# ObservableCollection 的等效项

    我想知道是否存在一种数据结构 其行为类似于 ObservableCollection 几乎就像 C 中一样 能够采用某种类型 ex 在 C 中我可以说 ObservableCollection
  • 通过浏览器链接在代码中连接 teamviewer

    我有一个问题让我抓狂 我已经成功地将我的 teamviewer 会话从浏览器 uri 连接到我所需的远程资源 我通过在浏览器地址栏中使用以下 uri 命令来实现此目的 实际上 这是 html 中的按钮单击 teamviewer8 remot
  • SPARK SQL 中的相关子查询列不允许作为非相等谓词的一部分

    我正在尝试在 where 子句中编写一个子查询 如下所示 但我越来越 非等式谓词中不允许有相关列 SELECT holidays FROM SELECT s holidays s entity FROM transit t tt WHERE
  • Angular bootstrap ui 模式使用相同的控制器而不是新的控制器

    我正在使用 Angular Bootstrap ui 模态框 它说要为新控制器提供一个新的 modalInstance 我想使用与初始化模态框相同的控制器 我搜索但没有成功 我找到了此链接 但没有成功 如何在 Angular UI Boot
  • 使用 Linq 将列表框项值转换为 int

    我使用列表框显示数据库中表的内容 每个列表框项目都使用设置为友好名称的 Text 属性和设置为唯一 ID 列的 Value 属性进行填充 数据库结构可能类似于以下内容 CREATE TABLE GENERIC FRIENDLY NAME T
  • 独立于 Rails 在 HAML 文件中使用布局

    我的最终目标是创建几个静态 HTML 文件以交给其他人 但对于我的工作流程 我希望将 HAML 作为基本源文件 在这样做时 我希望至少在我这边能够干燥这个过程 现在我有很多页面最终将共享一个通用布局 我想知道如何合并这些布局 这是我当前的代
  • 在没有缓冲区的情况下将数据从 fstream 复制到 stringstream?

    无论如何 我可以从fstream 一个文件 到一个stringstream 内存中的流 目前 我正在使用缓冲区 但这需要双倍的内存 因为您需要将数据复制到缓冲区 然后将缓冲区复制到字符串流 直到删除缓冲区为止 数据都会在内存中复制 std
  • 使用 PHP SSH 连接到远程服务器

    我想做一个SSH使用 php 连接到远程服务器 我在 Linux CEntOS 上使用 php 5 3 到目前为止我所做的 connection ssh2 connect 192 168 1 22 22 ssh2 auth password
  • 使用 foreach 迭代对象列表

    我看到这样的说法 当在对象列表上使用 foreach 时 迭代的对象实例is not可编辑 但对象属性are可编辑 有人可以用一个简单的例子来演示上述内容吗 让我重新表述一下 因为我发现了两个版本的说法 也许这个说法更清楚 当对元素列表使用
  • .Net Core动态dbContext

    我有两个 DbContext 共享同一个存储库 以下是我现有的代码 启动 cs services AddDbContext
  • redshift 上 array_agg() 或 string_agg() 的替代方案

    我正在使用此查询来获取聚合结果 select bs string agg wbns from bag group by 1 我收到此错误 运行查询时出错 函数 string agg 字符变化 未知 不存在提示 没有函数与给定的名称和参数匹配
  • Hibernate/JPA中涉及继承时如何指定列名?

    我想我想在这里鱼和熊掌兼得 但我们会看看是否有一个合理的解决方案来满足我正在寻找的问题 我有一个 Spring Boot JPA Hibernate 应用程序 它将与 MySQL 作为其后备存储进行通信 我有几种情况 从 OOP 的角度来看