我有一个@MappedSuperclass,它是我所有实体的基类(@Entity,直接或间接通过多个子类)。
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlAttribute(required = true)
private Long primaryKey;
生成ID如上所示。
我的问题是每个@Entity的@ Id计数器是相同的。事实上,这不是一个大问题,因为它需要一段时间才能达到Long.MAX_VALUE。但达到最大值要容易得多,因为所有实体只有一个计数器。如何在不必将上述代码添加到所有@ Entity类的情况下使用不同的@ Id计数器?
(如果对你的回答很重要:我使用的是H2数据库。)
答案 0 :(得分:2)
如果您的数据库和表格支持AUTO_INCREMENT
,请将注释更改为此@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
。然后在提交期间生成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
答案 1 :(得分:0)
@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;