2009-11-06 21 views
4

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

回答

2

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

但是,使用标准JPA无法执行此操作。虽然@GeneratedValue注释确实定义了generator参数,它使您能够specify a custom generator它不提供任何写入机制(只允许您使用内置的表/序列生成器)。

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

声明:我还没有尝试过使用EclipseLink的上述;不过,我在Hibernate中做了一些非常类似的事情。

1

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

正如您清楚地知道的那样,指定使用XML对于跨数据存储库部署有好处。

+0

有趣。我会向Eclipselink人员提出问题。这肯定会让事情变得更简单。 – Tim 2009-11-09 16:27:19