2011-10-10 91 views
1

我正在扩展一个不会自动生成其ID的实体。有没有办法来重写继承的生成策略?

我想在我的派生类中将其生成策略'重写'为AUTO。

就是这样。

@Entity 
public class Base { 

    @Id 
    @Column(name = "id") 
    public Integer getId() { 
     return id; 
    } 

} 

@Entity 
public class Extender extends Base { 

    @GeneratedValue(strategy = GenerationType.AUTO) 
    public Integer getId() { 
     return super.getId(); 
    } 
} 

这是我所得到的,当我尝试这样做:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Extender column: id (should be mapped with insert="false" update="false") 

我明白为什么会这样,但我需要知道是否有这样做的一种有效方式。

谢谢,

回答

2

这是不可能的,因为您只能定义一次主键,并且GeneratedValue只能在主键定义的位置。而同样从规格话:

2.4主键和实体标识
...主键必须完全一旦实体层级定义。

11.1.17生成值注释
... GeneratedValue注释可以与Id注释一起应用于实体或映射超类的主键属性或字段。

0

这看起来不正确。如果你想使用继承您必须

  • 指定在基类@javax.persistence.Inheritance和选择的策略的继承是如何被映射(枚举InheritanceType
  • 注释类Base@javax.persistence.MappedSuperclass

也可以看一下注释@javax.persistence.Transient,它使您可以在超类或超级接口中定义一个属性,而不必在那里指定映射。

我不喜欢在数据模型中继承所有的开发者倾向于使用instanceof运营商,这将给在运行时意外的结果,如果你没有你的实体类的实际实例,但一个Hibernate生成的代理对象(在延迟加载的情况下)。

+0

指定'javax.persistence.Inheritance'不是强制性的,默认是'SINGLE_TABLE'。我没有在这里包含所有的代码,请假定它是正确的并且工作(除了@Id部分)。 – Simeon

+0

你的意思是我可以在我的基类id中指定'@ Transient',然后在派生类中进一步定义它? – Simeon

相关问题