从标准 JPA (EclipseLink) 迁移到Hibernate时,由于子记录数量不正确和/或子对象的类型无效,测试失败。我认为问题是Hibernate生成的 SQL 没有在InheritanceType.SINGLE_TABLE关系的 where 子句中使用鉴别器列。
关于在映射中更改什么的任何建议?
提前感谢,
蒂莫西
环境
域背景
一个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;
我觉得这个可以用< 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时发生了这种情况。我已经搜索了很多天来寻找解决方案,但都没有成功。提前谢谢你!