我想在我的生产 MySQL 系统中使用 GenerationType.IDENTITY 作为主键。但是对于本地开发和测试,我更愿意使用HSQLDB。问题是 HSQLDB 不支持 GenerationType.IDENTITY(至少对于 Eclipselink)。我尝试设置 GenerationType.AUTO,对于 HSQLDB,它默认为 TABLE,但不幸的是,它对 MySQL 也是如此,这不是我想要的。有什么方法可以在 persistence.xml 中覆盖它吗?我可以使用其他一些技巧让每个环境都做正确的事吗?我没有在 XML 中设置任何实体配置(全部在注释中)并且我不想更改它,所以我正在寻找一种避免这种情况的方法。
最佳答案
这里的基本思想是使用一个自定义生成器,该生成器将根据元数据信息在身份和表(或您需要的任何其他策略)之间进行内部切换。
但是,使用标准 JPA 无法做到这一点。虽然 @GeneratedValue
注释确实定义了 generator
参数,使您能够 specify a custom generator它不提供任何编写机制(只允许您使用内置的表/序列生成器)。
由特定的 JPA 提供程序来(不)实现此功能。 EclipseLink 维基 has an example如何定义自定义生成器。您需要更改它以在内部创建 TableSequence
/NativeSequence
实例并根据 session.getPlatform()
在两者之间切换.
免责声明:我还没有尝试使用 EclipseLink 进行上述操作;不过,我在 Hibernate 中做了非常相似的事情。
关于java - 支持用于测试/生产的不同 JPA 生成类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1689553/