支持不同的JPA GenerationTypes进行测试/生产

时间:2009-11-06 18:53:33

标签: java jpa eclipselink

我想在我的生产MySQL系统中使用GenerationType.IDENTITY作为主键。但是对于本地开发和测试,我想使用HSQLDB。问题是HSQLDB不支持GenerationType.IDENTITY(至少使用Eclipselink)。我尝试设置GenerationType.AUTO,默认为TABLE for HSQLDB,但不幸的是它对MySQL也是如此,这不是我想要的。有没有办法在persistence.xml中覆盖它?我可以使用其他一些技巧,以便每个环境做正确的事情吗?我没有在XML中设置任何实体配置(它都在注释中),我不想改变它,所以我正在寻找一种避免这种情况的方法。

2 个答案:

答案 0 :(得分:2)

这里的基本思想是使用一个自定义生成器,它将根据元数据信息在身份和表(或您需要的任何其他策略)之间进行内部切换。

然而,使用标准JPA无法做到这一点。虽然@GeneratedValue注释确实定义generator参数,使您specify a custom generator,但它不提供任何写入机制(仅允许您使用内置表/序列生成器)。

由特定的JPA提供程序决定(不)实现此功能。关于如何定义自定义生成器的EclipseLink wiki has an example。您需要更改它以在内部创建TableSequence / NativeSequence个实例,并根据session.getPlatform()在两者之间切换。

免责声明:我没有尝试使用EclipseLink;不过,我在Hibernate中做了类似的事情。

答案 1 :(得分:1)

HSQLDB显然本身支持IDENTITY列(绝对是在v1.8中),所以这是EclipseLink中的一个缺陷。例如,DataNucleus为HSQLDB提供IDENTITY支持。

如您所知,使用XML指定有利于跨数据存储区部署。