JPA @MappedSuperclass 子类的不同 Id 计数器

JPA @MappedSuperclass different Id counters for subclasses

我有一个@MappedSuperclass,它是我所有实体的基础-class(@Entity,直接或间接通过多个子classing)。

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlAttribute(required = true)
private Long primaryKey;

Id 生成如上所示。

我的问题是每个@Entity 的@Id 计数器都相同。事实上这不是什么大问题,因为到达 Long.MAX_VALUE 需要一段时间。但达到最大值要容易得多,因为所有实体只有一个计数器。如何使用不同的@Id-counter 而不必将上述代码添加到所有@Entity-classes?

(如果这对您的回答很重要:我使用的是 H2 数据库。)

如果您的数据库和表支持 AUTO_INCREMENT,请将注释更改为此 @Id @GeneratedValue(strategy=GenerationType.IDENTITY)。然后在commit的时候会生成id。

还有另一种方法通过 TABLE 或 SEQUENCE 策略,但需要根据 Entity 明确定义,这是抽象 BaseEntity 的问题。随便看看:

@Entity
@TableGenerator(name="tab", initialValue=0, allocationSize=50)
public class EntityWithTableId {
    @GeneratedValue(strategy=GenerationType.TABLE, generator="tab")
    @Id long id;
}

编辑: 嗯,所以这是可能的! MappedSuperclass - Change SequenceGenerator in Subclass

@Id
@Column(name = "ID", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "SEQ_AAAAAAAAAAA")
@TableGenerator(
name = "SEQ_AAAAAAAAAAA", 
table = "SEQ_ENTITY" /*<<<==YOUR TABLE NAME FOR SAVE NEXT VALUES HERE*/, 
pkColumnName = "ENTITY", 
initialValue = 1, 
valueColumnName = "NEXT_ID", 
pkColumnValue = "packageee.PACK.PAK.YOURCLASSNAME",     
allocationSize = 1)
private Long id;