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