java - 支持用于测试/生产的不同 JPA 生成类型

标签 java jpa eclipselink

我想在我的生产 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/

相关文章:

java - 如果 NULL 值如何忽略更新或插入连接

hibernate - HQL 到 JPQL 的问题

java - 如何用java插入mysql数据库

java - 在用户存储库中使用安全注释时的 spring-data-rest 和 spring security 循环引用

java - 在 jpa hibernate SQL Server 中将 float/int 转换为日历

java - 我们如何在 eclipseLink 中使用自己的集合进行延迟加载?

hibernate - 如何在 JPA 2.1 中进行批量更新、删除、插入时调用回调方法,如@PreUpdate、@PrePersist、@PreRemove?

java - 在 O(n) 时间和 O(1) 空间内将所有 x 元素插入数组末尾

java - 如何从java确定mysql中存储过程中没有参数

java - 在自定义 surfaceView 中绘制时在主要 Activity 中创建按钮