如何为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
相关产品推荐
相关产品推荐

