使用GenerationType.SEQUENCE时能否为所有实体共用同一个序列?
解决方案
你可以将@SequenceGenerator注解从单个实体类迁移到公共父类DataObject上,所有继承该父类的实体就会自动复用同一个全局序列,不会再为每个实体单独创建序列。
修正后的代码示例
- 公共父类配置
@MappedSuperclass // 全局序列生成器,所有子类共享 @SequenceGenerator( name = "idgen", sequenceName = "global_common_seq", // 全局唯一的数据库序列名 initialValue = 1, allocationSize = 100 // 建议根据批量插入量级调整,减少序列查询次数 ) public abstract class DataObject implements Serializable { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idgen") @Column(name = "id") private int id; }
- 业务实体类配置,不需要再单独声明序列生成器
@Entity @Table(name = "entity_a") public class EntityA extends DataObject { } @Entity @Table(name = "entity_b") public class EntityB extends DataObject { }
注意事项
- 配置
allocationSize时需要确保和hibernate.id.new_generator_mappings配置为true(Hibernate 5.2+版本默认开启),否则可能出现主键重复问题。数值可以根据实际批量插入的量级调整,越大批量插入性能越高。 - 全局序列会生成全局唯一、但不同实体间不连续的主键,需要确认业务逻辑不依赖单表主键连续。
- 如果是存量系统切换方案,需要先将全局序列的初始值设置为当前所有表最大主键值+1,避免主键冲突。
内容的提问来源于stack exchange,提问作者java dev
相关产品推荐
相关产品推荐

