这个问题与this thread中提到的问题有关。 我在MySQL上使用JPA时也遇到了同样的问题。只有当我将生成策略更改为TABLE时,我才能解决它。
但问题是,这个问题背后的原因是什么以及为什么将策略更改为TABLE是解决方案(这在[{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;
}
}