java - 如何使用 Hibernate/JPA 注释覆盖 GenerationType 策略?

标签 java hibernate jpa annotations

我正在考虑使用注解来定义我的 Hibernate 映射,但遇到了一个问题:我想使用基本实体类来定义公共(public)字段(包括 ID 字段),但我希望不同的表具有不同的 ID 生成策略:

@MappedSuperclass
public abstract class Base implements Serializable {
    @Id
    @Column(name="ID", nullable = false)
    private Integer id;
    public Integer getId(){return id;}
    public void setId(Integer id){this.id = id;}
    ...
}

@Entity
@Table(name="TABLE_A")
public class TableA extends Base {
    // Table_A wants to set an application-defined value for ID
    ...
}

@Entity
@Table(name="TABLE_B")
public class TableB extends Base {
    // How do I specify @GeneratedValue(strategy = AUTO) for ID here?
    ...
}

有什么办法吗?我已经尝试将以下内容包含到 TableB 中,但 hibernate 反对我两次使用同一列,这似乎是错误的:

@Override // So that we can set Generated strategy
@Id
@GeneratedValue(strategy = AUTO)
public Integer getId() {
    return super.getId();
}

最佳答案

在上面的代码中,看起来您在字段(父类(super class))和方法(子类)上混合注释。 hibernate reference documentation建议避免这种情况,我怀疑这可能是导致问题的原因。根据我使用 Hibernate 的经验,注解 getter/setter 方法比注解字段更安全、更灵活,因此我建议尽可能坚持这种设计。

作为您问题的解决方案,我建议从您的 Base 父类(super class)中完全删除 id 字段。相反,将该字段移动到子类中,并在您的基类中创建抽象的 getId()setId() 方法。然后在您的子类中覆盖/实现 getId()setId() 方法,并使用所需的生成策略注释 getter。

希望这对您有所帮助。

关于java - 如何使用 Hibernate/JPA 注释覆盖 GenerationType 策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/328202/

相关文章:

hibernate - Grails 2.0 hibernate 注释-不起作用

java - Ehcache + Hibernate日志输出

java - 使用实体列表的 JPA Criteria API 持久字段 IN 表达式

java - 使 x0 和 y0 从 jframe 的中心开始?

java - 用于 spring 和 hibernate 应用程序的虚拟主机

sql-server - 为 SQL Server 设置 Maven 依赖项

java - 持久化没有 ID 的第三方类

java - jpa 返回哪些集合?

java - 在 Spring JPA 中关联嵌套对象 ID

java - 当我运行 jsp 页面时,没有显示图像。为什么?