You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为JPA和Hibernate中不同子类实体生成独立ID

解决特定子类自定义ID生成器的方案

你现在遇到的问题是父类的ID生成器被所有子类共享,要给特定子类单独配置生成器其实很简单,核心就是在目标子类上重新定义ID字段,并指定专属的生成器,覆盖父类的默认配置就行,下面一步步给你演示:

1. 先准备新的ID生成器类

假设你要给另一个继承AbstractCompany的子类(比如叫BranchCompany)单独做一个生成器,先写好这个生成器类:

public class BranchIdGenerator implements IdentifierGenerator {
    @Override
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
        Connection connection = session.connection();
        try {
            // 注意这里要查询子类对应的表(branch_company)的max(id)
            Statement statement = connection.createStatement();
            ResultSet rs = statement.executeQuery("select max(id) as Id from branch_company");
            if(rs.next()) {
                int id = rs.getInt(1) + 1;
                return new Integer(id);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

2. 在目标子类上重新配置ID字段

在你需要自定义生成器的子类里,重新定义id字段,并指定刚才写的新生成器,覆盖父类的配置:

@Entity
@Table(name="branch_company")
public class BranchCompany extends AbstractCompany implements Serializable {
    // 重新定义ID字段,绑定专属生成器
    @Id
    @GenericGenerator(name = "branch_id", strategy = "com.ivc.talonsystem.util.keygens.BranchIdGenerator")
    @GeneratedValue(generator = "branch_id")
    @Column(name = "id")
    private Integer id;

    // 子类自己的属性
    @NotEmpty
    @Column(name = "branch_code")
    private String branchCode;

    // 别忘了getter和setter方法
}

3. 原有子类保持不变

你现有的Rju类不需要做任何修改,它依然会使用父类继承来的RjuIdGenerator,而新的BranchCompany会用你刚配置的BranchIdGenerator,两者互不干扰。

原理说明

因为你用的是InheritanceType.JOINED继承策略,每个子类都有自己独立的数据库表。当子类重新定义@Id字段并指定新的生成器时,Hibernate会优先使用子类的配置,而不是父类的。这样每个子类的ID生成逻辑就可以完全独立,各自针对自己的表生成ID。


内容的提问来源于stack exchange,提问作者Frank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:11:01