Hibernate继承TABLE策略为何需独立序列表?能否用各表IDENTITY列?
关于Hibernate TABLE继承策略中ID生成的疑问解答
首先得明确TABLE继承策略的核心逻辑:父类和每个子类都对应独立的数据库表,父表存储公共属性,子表仅存特有属性,父子表通过相同的主键值关联。这就要求所有实体(父类+子类)的ID必须是全局唯一的,否则查询父类数据时,不同子表的重复ID会直接导致数据关联混乱。
为什么不能用各表的IDENTITY列?原因很直接:
- IDENTITY是数据库层面的自增策略,每个表独立维护自增序列,不同子表的ID极易重复(比如子表A的ID从1开始,子表B的ID也从1开始)。这种情况下,查询父类对应的所有子类数据时,根本无法区分ID=1的记录到底来自哪个子表,父子表的关联逻辑直接失效。
- 而TABLE生成器是通过一个专门的序列表(默认是
hibernate_sequences)统一生成全局唯一ID,所有实体的ID都从这个表获取,从根源上保证了跨表的ID唯一性,完美适配TABLE继承策略的关联需求。
再看你贴的代码:
@Id @GeneratedValue(strategy = GenerationType.TABLE) @Column(updatable = false, nullable = false, insertable = false) protected int id;
这里insertable = false和updatable = false是因为ID由TABLE生成器负责生成和维护,不需要手动插入或更新,避免和生成器的逻辑冲突。
内容的提问来源于stack exchange,提问作者AMZ
相关产品推荐
相关产品推荐

