在我的带有Derby 10.11.1.1的GlassFish 4.1上运行的Java EE应用程序中,我目前正在使用以下技术在我的每个jpa实体中自动生成主键:
@TableGenerator(name = "Entity1_Generator", table = "ID_Gen", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", initialValue = 0, allocationSize = 1)
@Id
@GeneratedValue(generator = "Entity1_Generator")
private Long id;
我昨天决定将@Id
移动到@MappedSuperclass
,然后在我的每个实体中扩展映射的超类。不幸的是,我很快发现EclipseLink不支持覆盖子类上的@TableGenerator
或@SequenceGenerator
。以下是一些参考文献:
根据这些信息,我提出了以下选项:
@Id
移动到我映射的超类的目标。 (啵!)@TableGenerator
。 (育!)@GeneratedValue
并使用EJB创建主键。我查看了以下EclipseLink自定义排序信息,但是从文档中我不能确定我能够获取允许我为每个实体创建序列的区分信息。
我现在认为创建一个控制我的序列的无状态或单例EJB会很容易。我只需从代码中删除@GeneratedValue
注释,然后在保留实体之前执行以下代码。
myEntity.setId(idGenerator.getNextMyEntityId());
使用IDGenerator控制我的主键生成,具有以下优点:
@Id
移至映射的超类。@TableGenerator
。使用EJB创建主键有哪些风险?