结合 TABLE_PER_CLASS 继承和 TableGenerator

时间:2021-07-26 15:19:34

标签: java spring hibernate jpa inheritance

有没有办法让包含在休眠中具有 TABLE_PER_CLASS 继承的 ID 定义的抽象实体的每个子项具有不同的段列值?

我有两个从 asbtract 实体扩展而来的实体,如下所示:

@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 继承策略是最适合我们数据库当前架构的策略,事实上现在没有办法创建新表 Credential。 EntityA 和 EntityB 是两个具有很多行的现有表,我需要 Credential 作为实体(而不是 @MappedSuperClass)才能仍然能够拥有 @OneToMany 关系。

当我必须保存这两个实体中的一个新实体时,预期的行为是在我的 CORE_CREDENTIAL_ID_GEN 中为每个实体创建不同的行,一个用于 EntityA,另一个用于 EntityB,但结果只有一行,其中包含凭据,如下所示:< /p>

+----+------------+-----------+
| id | GEN_NAME   | GEN_VALUE |
+----+------------+-----------+
|  1 | Credential |     50099 |
+----+------------+-----------+

那么有没有一种配置方法可以使这一代 id 表具有预期的行为?

感谢您的帮助

(我的数据库环境是 MariaDB 10.3)

1 个答案:

答案 0 :(得分:1)

这是意料之中的。如果您想要不同的 id 空间,您必须将实体分开,即删除超类。 NULL 有什么问题?如果您愿意,您可以参考这两个实体,例如

@OneToMany
相关问题