有没有办法让包含在休眠中具有 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)
答案 0 :(得分:1)
这是意料之中的。如果您想要不同的 id 空间,您必须将实体分开,即删除超类。 NULL
有什么问题?如果您愿意,您可以参考这两个实体,例如
@OneToMany