我正在考虑使用注释来定义我的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状态是我两次反对同一栏,这似乎是错误的:
TableB
@Override // So that we can set Generated strategy @Id @GeneratedValue(strategy = AUTO) public Integer getId() { return super.getId(); }
在上面的代码中,您似乎在混合字段(超类)和方法(子类)的注释。Hibernate 参考文档建议避免这种情况,我怀疑这可能是导致问题的原因。根据我在Hibernate中的经验,无论如何,注释getter / setter方法而不是字段都是更安全,更灵活的方法,因此,我建议您尽量使用该设计。
为了解决您的问题,建议您从Base超类中完全删除 id 字段。而是将该字段移到子类中,并在Base类中创建抽象的 getId() 和 setId() 方法。然后在子类中重写/实现 getId() 和 setId() 方法,并使用所需的生成策略对getter进行注释。
希望这可以帮助。