如何将 Oracle 12c 自动身份生成与 Hibernate、Spring 和 JPA 结合使用?

chr*_*ris 5 oracle spring hibernate spring-data-jpa

我已经这样定义了我的表:

CREATE TABLE MY_ENTITY (
  ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
);
Run Code Online (Sandbox Code Playgroud)

使用@GeneratedValue(strategy = GenerationType.SEQUENCE)不会产生错误。手动插入一些具有固定 ID 的数据并更新序列后,我注意到 ID 实际上并不是由 Oracle 生成的。我像这样更新了序列:

ALTER TABLE MY_ENTITY MODIFY (ID GENERATED AS IDENTITY START WITH LIMIT VALUE);
Run Code Online (Sandbox Code Playgroud)

如何让 Hibernate/JPA 使用 Oracle 12c 身份生成器?

chr*_*ris 12

要使用 Oracle 12c 身份生成,请至少使用Hibernate 5.3。例子:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.4.4.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

您的application.properties遗嘱需要提供Oracle12cDialect.

spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect
spring.datasource.platform=oracle
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@hostname:1521:MYSID
spring.datasource.username=MY_USER
spring.datasource.password=$ecret
spring.jpa.hibernate.ddl-auto=none
Run Code Online (Sandbox Code Playgroud)

给定一个具有自动生成主键的表:

CREATE TABLE MY_ENTITY (
  ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY
);
Run Code Online (Sandbox Code Playgroud)

用作GenerationType.IDENTITYJPA 实体上的策略。

@Entity
@Table(name = "MY_ENTITY")
public class MyEntity {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // the rest of your properties

}
Run Code Online (Sandbox Code Playgroud)

要检查它是否正常工作,请使用以下内容更新自动生成的序列:

ALTER TABLE MY_ENTITY MODIFY (ID GENERATED AS IDENTITY START WITH 10000);
Run Code Online (Sandbox Code Playgroud)

插入新条目时,它们的 ID 应类似于1000110002等。