每个类具有唯一ID的Sping Boot JPA BaseEntity

nlejzf6q  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(136)

我有一个抽象类BaseEntity,其中包含我想与项目中的多个对象共享的字段。

@MappedSuperclass
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public abstract class BaseEntity {
    
        @Id
        @Column(name = "objectId", insertable = false, updatable = false)
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long objectId;
    
        @Column(name = "createdDate", updatable = false/*, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP"*/)
        @CreationTimestamp
        private Date createdDate;
    
        @Column(name = "updatedDate"/*, columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP"*/)
        @UpdateTimestamp
        private Date updatedDate;
    
        @Column(name = "active", columnDefinition = "boolean default false")
        private boolean active;
}

我有多个从这个类继承的实体
举两个例子:
1.用户名
1.联络人
在DB上保存User对象时,我可以看到objectId字段正在递增,但对于另一个对象(如Contact)也是如此
例如:
我创建了一个用户的示例并将其保存在数据库中,保存后我可以看到我的User.objectId = 1
之后,我创建了一个Contact的示例,并将其保存在DB中,持久化后,我可以看到我的Contact.objectId = 2
如何使每个实体的字段objectId分别递增?

  • 谢谢-谢谢
zfycwa2u

zfycwa2u1#

您 没有 说明 您 是否 使用 Hibernate 作为 JPA 实现 , 但 由于 这 是 迄今 为止 最 常见 的 选择 , 我 将 根据 它 来 回答 。
GenerationType.AUTO 指定 为 @GeneratedValue 标识 符 的 策略 时 , 持久 性 提供 程序( Hibernate ) 选择 策略 。 Hibernate 使用 SEQUENCE 作为 默认 选择 *( 除非 您 另行 配置 ) , SEQUENCE 默认 行为 是 使用 单个 共享所有 Hibernate 管理 的 实体 的 DB 序列 。 这 就是 为什么 你 会 看到 ID 在 所有 实体/表 中 递增 , 而 不是 每个 表 的 ID 是 独立 的 。
如果 您 想 继续 使用 基于 序列 的 ID 生成 , 可以 为 每个 实体 指定 一 个 序列 名 , 如 此处 所 示 。 这样 , 每个 实体 类型 ( 表 ) 都 可以 有 一 个 独立 的 ID 序列 。 请 注意 , 如果 您 有 很多 实体/表 , 这种 方法 将 为 每个 实体/表 生成 一 个 单独 的 DB 序列 , 这 可能 并 不 理想 。
另 一 个 直接 的 方法 是 将 GenerationType 更改 为 IDENTITY

    • 请 注意 * * :在 决定 ID 生成 策略 时 , 还有 其他 选项 和 许多 考虑 因素 ( 例如 性能 和 对 批 插入 的 支持 ) 。 我 强烈 建议 您 从 这里 开始 阅读 Hibernate 文档 , 以 充分 了解 这些 选项 并 根据 您 的 具体 情况 做出 明智 的 选择 。
  • 这 对于 MySQL 来说 并 不 完全 正确 , 因为 MySQL 本身 似乎 并 不 支持 序列 。 对于 MySQL , Hibernate 将 回 退到 使用 TABLE 策略 , 如 这里 所 述 。
9jyewag0

9jyewag02#

如果希望每个具体类都有不同的序列,则@Id和@GeneratedValue注解(以及PK字段)应该位于具体类中,而不是位于根抽象类中。

相关问题