【发布时间】:2021-10-02 13:04:32
【问题描述】:
有没有办法让抽象实体的每个子实体的段列值不同,该实体包含在休眠中具有 TABLE_PER_CLASS 继承的 ID 定义?
我有两个从抽象实体扩展而来的实体,如下所示:
@Entity
@GenericGenerator(name = "credentialIdGenerator",
strategy = "org.hibernate.id.enhanced.TableGenerator",
parameters = {
@org.hibernate.annotations.Parameter(name = "value_column_name", value = "GEN_VALUE"),
@org.hibernate.annotations.Parameter(name = "segment_column_name", value = "GEN_NAME"),
@org.hibernate.annotations.Parameter(name = "table_name", value = "CORE_CREDENTIAL_ID_GEN"),
@org.hibernate.annotations.Parameter(name = "prefer_entity_table_as_segment_value", value = "true"),
@org.hibernate.annotations.Parameter(name = "optimizer", value = "pooled-lo"),
@org.hibernate.annotations.Parameter(name = "initial_value", value = "50000"),
@org.hibernate.annotations.Parameter(name = "increment_size", value = "100")})
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Credential implements Serializable {
@Id
@GeneratedValue(generator = "credentialIdGenerator")
@Column(name = "ID")
private int id;
}
@Entity
@Table(name = "entity_a")
public class EntityA extends Credential { ... }
@Entity
@Table(name = "entity_b")
public class EntityB extends Credential { ... }
事实上TABLE_PER_CLASS继承策略是最适合我们DB当前架构的策略,事实上目前还没有办法创建新表Credential。 EntityA 和 EntityB 是两个包含很多行的现有表,我需要 Credential 作为实体(而不是 @MappedSuperClass)才能仍然能够拥有 @OneToMany 关系。
当我必须保存这两个实体中的一个新实体时,预期的行为是在我的 CORE_CREDENTIAL_ID_GEN 中为每个实体有不同的行,一个用于 EntityA,另一个用于 EntityB,但结果只是一行具有如下凭据:
+----+------------+-----------+
| id | GEN_NAME | GEN_VALUE |
+----+------------+-----------+
| 1 | Credential | 50099 |
+----+------------+-----------+
那么有一种配置方法可以使这个生成 id 表具有预期的行为吗?
感谢您的帮助
(我的数据库环境是 MariaDB 10.3)
【问题讨论】:
标签: java spring hibernate jpa inheritance