当前位置: 首页 > 知识库问答 >
问题:

从 JPA 到Hibernate的单表继承的迁移问题

夹谷硕
2023-03-14

从标准 JPA (EclipseLink) 迁移到Hibernate时,由于子记录数量不正确和/或子对象的类型无效,测试失败。我认为问题是Hibernate生成的 SQL 没有在InheritanceType.SINGLE_TABLE关系的 where 子句中使用鉴别器列。

关于在映射中更改什么的任何建议?

提前感谢,

蒂莫西

环境

    < li>postgres 9.6.17 < li >Spring靴/ JPA 2.4.0 < li>postgres mvn相关性42.2.18

域背景

一个Dc电机最多可以有2组连线。在实体中表示,每个连线都在自己的List中。这些连线是ARM或EQ类型的。由于连线上的属性相同,DBA选择了一个表,其中包含一个名为coil_type的鉴别器列,其值为ARM或EQ。

类定义

父实体

@Entity 
@Table(name = "dc_motor")
public class DcMotor implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Version
    private Integer version;
  //other direct fields

    @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "motor_id", referencedColumnName = "id", nullable = false)
    @OrderColumn(name = "idx")
    private List<WireArm> armWires;

    @OneToMany(orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "motor_id", referencedColumnName = "id", nullable = false)
    @OrderColumn(name = "idx")
    private List<WireEq> eqWires;

WireArm 和 WireEq 的抽象基类

@Entity 
@Table(name = "dc_wire")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "coil_type", length = 10, discriminatorType = DiscriminatorType.STRING)
public abstract class DcWire implements IDcWire {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // other direct fields
    // discriminator column coil_type is not explicitly listed as a field

具体子类

@Entity
@DiscriminatorValue(value = "ARM")
public class WireArm extends DcWire implements IDcWire {
    // just constructors
}

@Entity
@DiscriminatorValue(value = "EQ")
public class WireEq extends DcWire implements IDcWire {
    // just constructors
}

生成的 SQL

select /*all fields*/ from dc_motor dcmotor0_ where dcmotor0_.id=1;
select /* all fields EXCEPT coil_type*/ from dc_wire armwires0_ where armwires0_.motor_id=1;
select /* all fields EXCEPT coil_type*/ from dc_wire eqwires0_ where eqwires0_.motor_id=1;

共有1个答案

邹祺然
2023-03-14

我觉得这个可以用< code > org . hibernate . annotations . discriminator options(force = true)解决。

 类似资料:
  • 问题内容: 我正在尝试将应用程序从Hibernate 3.4.0.GA迁移到Hibernate 5.1,并在完成对Java代码的必要更改后,在部署该应用程序时,我正在观察Hibernate如何尝试 创建HT_表 (全局临时 表 ) ,每个 @Inheritance带 注释的实体一个。 在Google上搜索后,我找到了创建表的原因。 但就我而言,我们不允许更改数据库以添加新表。 我的继承模型只有一层

  • 我将web应用程序升级为使用Hibernate 4。在那之后,我遇到了一些问题,我需要帮助。 我有一个域对象的基类,如下所示: 然后,我有很多实体,比如: 我在实体之间有一些继承: 当我进行hql查询时,我得到了这个异常 在hibernate源代码中,我看到,如果实体的父级hibernate在默认情况下处于SINGLE\u表继承状态,那么在每个查询中,它将连接鉴别器列,但我没有鉴别器列,因为每个类

  • 我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器类型列的表地址。 我能够使用不同的类型值在DB中成功保存/更新两个地址类型。 我面临的问题是当我查询地址表时,如下所示: 这工作正常,但查询ShippingAddress会引发非均匀查询结果异常,即结果中同时包含ShippingAddress和Billingaddress。请让我知道,我应该怎么做。

  • 并尝试通过Hibernate使用策略连接实现继承,但当我使用此策略时,我收到异常: 奇怪的是,如果我选择另一个策略(单表或TABLE_PER_CLASS),错误不会出现

  • 主要内容:单表策略示例单表策略是定义继承实现的最简单有效的方法之一。 在这种方法中,多个实体类的实例仅作为属性存储在单个表中。 以下语法表示单个表策略 - 单表策略示例 在这个例子中,我们将员工分为活跃员工和退休员工。 因此,子类和继承父类的和字段。 现在,按照以下步骤创建JPA项目 - 第1步: 在包下创建一个根实体类并指定所有必需的属性和注释。 文件:Employee.java - 第2步: 在包下创建实体类(它是

  • 我有以下课程: 当我在开放会话中从方法时,会抛出异常: 数据库中列的值是,但似乎hibernate试图将此对象标识为。 此外,当我处于调试模式并且我在断点上计算字段的实时值时,该异常不会引发。 此代码在hibernate 4中运行良好,但当我升级到hibernate 5.2.17时发生了这种情况。我已经搜索了很多天来寻找解决方案,但都没有成功。提前谢谢你!