【问题标题】:Migration issue with Single Table Inheritance from JPA to hibernate单表继承从 JPA 到休眠的迁移问题
【发布时间】:2021-03-16 01:49:30
【问题描述】:

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

对映射中的哪些更改有何建议?

提前致谢,

提摩太

环境

  • postgres 9.6.17
  • 弹簧靴/JPA 2.4.0
  • postgres mvn 依赖 42.2.18

域背景

一个 DcMotor 最多可以有 2 组电线。在实体中每个都在其自己的列表中表示。这些线是 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;

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    我认为这可以通过使用org.hibernate.annotations.DiscriminatorOptions(force = true)来解决。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多