java - 从 JPA 到休眠的单表继承迁移问题
问题描述
从标准 JPA (EclipseLink) 迁移到休眠时,由于子记录数量不正确和/或子对象的类型无效,测试会失败。我认为问题是休眠生成的 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;
解决方案
我认为这可以通过使用来解决org.hibernate.annotations.DiscriminatorOptions(force = true)
。
推荐阅读
- dictionary - 识别两个列表或字典中重复项的最佳方法?
- php - 尽管在 regex101 中成功匹配,但 PHP 正则表达式不起作用
- constraint-programming - 为什么更多的数组访问会执行得更好?
- python - 如何按大小对包含字符串和整数的列表进行排序,然后在 python 3 中输出整数或字符串
- c - 如何在宏中使用#ifdef?'#'后面没有宏参数
- mysql - 连接表中如何多列选择(两表切换)
- sql - 在 SQL 中用逗号分隔 XML 节点
- java - 是否可以将事件溯源与 StAX XML 事件序列一起使用
- html - 使用 flex 的按钮之间的空间
- php - 如何简化此功能 - 从数组返回键值?