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