不能在JPA中使用策略TABLE_PER_CLASS使用标识列密钥生成?

时间:2012-01-07 06:32:55

标签: inheritance jpa

这个问题与this thread中提到的问题有关。 我在MySQL上使用JPA时也遇到了同样的问题。只有当我将生成策略更改为TABLE时,我才能解决它。

但问题是,这个问题背后的原因是什么以及为什么将策略更改为TABLE是解决方案(这在[{3}}中仍然没有答案)?

3 个答案:

答案 0 :(得分:10)

要通过继承层次结构(JPA需要)拥有唯一ID,您显然无法使用TABLE_PER_CLASS和IDENTITY执行此操作,因为IDENTITY在表中工作,并且在继承层次结构中现在有多个“根”表。

例如抽象基类“Base”,以及子类“Sub1”,“Sub2”,“Sub3”。 所以你有实际的表“SUB1”,“SUB2”,“SUB3”。因此,如果使用IDENTITY,那么当使用MySQL时,这将等同于列上的“自动增量”。因此SUB1有它的id,SUB2有它的id,SUB3有它的id ......它们是独立的,因此可以在id中发生冲突...所以你不再在继承层次结构中有唯一的id。

答案 1 :(得分:0)

接受的答案(虽然陈旧)并不完全正确。使用GenerationType.IDENTITY并不意味着DB使用表生成。 GenerationType.IDENTITY的javadoc说:"表示持久性提供程序必须使用数据库标识列为实体分配主键。"。

答案 2 :(得分:0)

如果要在类之间共享某些属性,可以对超类使用@MappedSuperclass,这不会影响子类ID生成策略。它将所有注释复制到子类中

@MappedSuperclass
public class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(columnDefinition = "TIMESTAMP")
    private Date createTime = new Date();


    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
}