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



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

关于映射中要更改的内容,有什么建议吗?

提前感谢

Timothy

环境

  • 进展9.6.17
  • 弹簧套/JPA 2.4.0
  • 进展后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;

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

最新更新