Inheritance 无法对JPA中的策略表_PER_类使用标识列键生成?

Inheritance 无法对JPA中的策略表_PER_类使用标识列键生成?,inheritance,jpa,Inheritance,Jpa,这个问题与上文提到的问题有关。 在MySQL上使用JPA时,我也面临同样的问题。只有当我将生成策略更改为TABLE时,我才能解决这个问题 但问题是,这个问题背后的原因是什么?为什么将策略更改为TABLE是解决方案(这在中仍然没有答案)?要通过继承层次结构(JPA要求)拥有唯一的ID,显然不能使用TABLE_PER_类和IDENTITY,因为IDENTITY在表之外工作,在继承层次结构中现在有多个“根”表 e、 抽象基类“base”,以及子类“Sub1”、“Sub2”、“Sub3”。 所以你有实际

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


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

要通过继承层次结构(JPA要求)拥有唯一的ID,显然不能使用TABLE_PER_类和IDENTITY,因为IDENTITY在表之外工作,在继承层次结构中现在有多个“根”表

e、 抽象基类“base”,以及子类“Sub1”、“Sub2”、“Sub3”。
所以你有实际的表“SUB1”,“SUB2”,“SUB3”。因此,如果使用IDENTITY,那么这将等同于在使用MySQL时对列执行类似“自动增量”的操作。因此SUB1有它的ID,SUB2有它的ID,SUB3有它的ID。。。它们是独立的,因此可以在id中获得碰撞。。。因此,您在继承层次结构中不再具有唯一的id。

接受的答案(尽管很旧)不太正确。使用GenerationType.IDENTITY并不意味着数据库使用表生成。GenerationType.IDENTITY的javadoc说:“表示持久性提供程序必须使用数据库标识列为实体分配主键。”

如果您想在类之间共享某些属性,可以使用
@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;
    }
}