【发布时间】:2015-08-24 05:55:06
【问题描述】:
我正在开发一个 Java 应用程序,它应该在具有相同数据库架构的两个不同数据库上执行 CRUD 操作(使用 Hibernate 4.3.8)。 有一个 MySQL(版本 5.1.73)和一个 Oracle(11g Express Edition Release 11.2.0.2.0 - 64 位)数据库。
带有 JPA 注释 的 Java 类是使用 Hibernate Code Generation 从数据库表中生成的。
问题是我们现在需要使用自动主键生成,而 MySQL 使用 GenerationType.IDENTITY 而 Oracle 使用 GenerationType.SEQUENCE。此外,在极少数情况下,我们还需要自己手动设置主键。
注释类中的后续代码适用于两个数据库的自动密钥生成,但如果主键是自设置的,则会失败。
@GeneratedValue(strategy=GenerationType.AUTO, generator="sequence_generator")
@SequenceGenerator(name="sequence_generator", sequenceName="SEQUENCE1")
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
如果没有 @GeneratedValue 和 @SequenceGenerator 注释,可以手动设置主键,但自动生成不起作用。
【问题讨论】:
-
试试这个 [manually-specify-the-value-of-a-primary-key-in-jpa-generatedvalue-column][1]。有很多解决方案。 [1]:stackoverflow.com/questions/12002260/…
-
此线程中以数据库为中心的解决方案对我不起作用,因为不应更改数据库架构。除了我之外,还有其他人相信数据库架构不会改变。而且我不知道这是否可能以及如何编写自己的自定义 ID 生成器,它同时支持数据库 MySQL 和 Oracle(身份和序列)。在所有示例中,他们要么使用 IdentifierGenerator 要么使用 Sequencegenerator。
-
这个问题不清楚。您是说您希望 Hibernate 为某些类自动生成标识符并手动将标识符分配给其他类;或者您是说您希望 Hibernate 在大多数情况下自动为类的实例分配标识符,但在某些情况下您希望手动为同一类的某些实例分配标识符?
-
你应该使用触发器来拥有一个同构的跨数据库解决方案。
-
我的旧 Spring 4 项目过去在 MySQL 和 Oracle 11g 上都可以正常工作,只是带有
@SequenceGenerator(name = "id_generator", sequenceName = "sq_id_user")注释,但现在我在 Spring Boot 2 和 Hibernate 5 上抱怨一个非10.1.24-MariaDB 中的现有序列。
标签: java mysql oracle hibernate jpa