我有一个抽象类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
分别递增?
- 谢谢-谢谢
2条答案
按热度按时间zfycwa2u1#
您 没有 说明 您 是否 使用 Hibernate 作为 JPA 实现 , 但 由于 这 是 迄今 为止 最 常见 的 选择 , 我 将 根据 它 来 回答 。
将
GenerationType.AUTO
指定 为@GeneratedValue
标识 符 的 策略 时 , 持久 性 提供 程序( Hibernate ) 选择 策略 。 Hibernate 使用SEQUENCE
作为 默认 选择 *( 除非 您 另行 配置 ) ,SEQUENCE
默认 行为 是 使用 单个 共享所有 Hibernate 管理 的 实体 的 DB 序列 。 这 就是 为什么 你 会 看到 ID 在 所有 实体/表 中 递增 , 而 不是 每个 表 的 ID 是 独立 的 。如果 您 想 继续 使用 基于 序列 的 ID 生成 , 可以 为 每个 实体 指定 一 个 序列 名 , 如 此处 所 示 。 这样 , 每个 实体 类型 ( 表 ) 都 可以 有 一 个 独立 的 ID 序列 。 请 注意 , 如果 您 有 很多 实体/表 , 这种 方法 将 为 每个 实体/表 生成 一 个 单独 的 DB 序列 , 这 可能 并 不 理想 。
另 一 个 直接 的 方法 是 将
GenerationType
更改 为IDENTITY
。TABLE
策略 , 如 这里 所 述 。9jyewag02#
如果希望每个具体类都有不同的序列,则@Id和@GeneratedValue注解(以及PK字段)应该位于具体类中,而不是位于根抽象类中。