我正在考虑使用注解来定义我的 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/