TL; DR :为实体实现自定义TableGenerator的JPA方法是什么?
我们目前只有一个MySQL数据库,该数据库最初是使用EclipseLink生成(并已修改)的。
但是,我们最近决定实现访问数据库的Spring Boot应用程序,因此选择了Hibernate作为持久性提供程序。
实体的主键(ID)的生成如下(以Host.java
为例)
@Id
@TableGenerator(name = "Host.id", schema = "schema", table = "SEQUENCE", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "Host.id")
@GeneratedValue(generator = "Host.id", strategy = GenerationType.TABLE)
protected Long id;
我们遇到的问题是,EclipseLink和Hibernate之间为新创建的实体生成ID的算法不同。到目前为止,我已经设法使用以下Hibernate(persistence.xml
)设置来几乎获得我想要的结果:
<property name="hibernate.id.new_generator_mappings" value="true"></property>
<property name="hibernate.id.optimizer.pooled.prefer_lo" value="true"></property>
但是,两个JPA实现使用不同的算法来生成ID,在同时使用两个实现时会引起冲突。
我知道Hibernate @GenericGeneration
批注允许您将生成器指向IdentifierGenerator
的自定义实现,但是随后我们需要在我们的“数据模型”项目中包括Hibernate依赖项。 (与JPA实现无关)。
是否有一种方法可以修改我们的实体,使得EclipseLink和Hibernate使用相同的ID生成器实现?最好不要使用.xml
文件覆盖注释。
参考文献: