小编典典

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

hibernate

我正在考虑使用注释来定义我的Hibernate映射,但是遇到了一个问题:我想使用基础实体类来定义公共字段(包括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();
}

阅读 232

收藏
2020-06-20

共1个答案

小编典典

在上面的代码中,您似乎在混合字段(超类)和方法(子类)的注释。Hibernate
参考文档建议避免这种情况,我怀疑这可能是导致问题的原因。根据我在Hibernate中的经验,无论如何,注释getter /
setter方法而不是字段都是更安全,更灵活的方法,因此,我建议您尽量使用该设计。

为了解决您的问题,建议您从Base超类中完全删除 id 字段。而是将该字段移到子类中,并在Base类中创建抽象的 getId()
setId() 方法。然后在子类中重写/实现 getId()setId() 方法,并使用所需的生成策略对getter进行注释。

希望这可以帮助。

2020-06-20