java - Hibernate、id、oracle、序列

标签 java oracle hibernate orm jpa

我的数据库是 Oracle,我的 id 列值是一个 Oracle 序列,这个序列是由触发器执行的,所以,在插入每一行之前,这个触发器使用这个序列来获取 id 值。所以我很困惑我应该在我的实体类中定义哪个 id 策略生成。

@GenericGenerator(name = "generator", strategy = "increment")
@Id
@GeneratedValue(generator = "generator")

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "idGenerator")
@SequenceGenerator(name="idGenerator", sequenceName="ID_SEQ")

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

真的很困惑,有人可以阐明这个问题吗?请解释清楚..

最佳答案

我还有一个项目,其中有一个 Oracle 数据库向我的@Entity 类提供数据。如您所说,序列通过触发器为表的 PK 生成 id。这是我在其中一个类中使用的注释:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
@SequenceGenerator(name = "G1", sequenceName = "LOG_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
public int getId() {
    return this.id;
}

这是您在帖子中展示的第二种语法。 Java 代码中没有调用触发器,因为触发器由 DB 管理。我记得如果不想出现问题,我必须在数据库中同时拥有序列和触发器。触发器询问要插入的行的 ID 是否为空或 = 0。在这种情况下,调用序列 LOG_SEQ。

因此,如果您为实体的@Id 提供一个值,它可以插入到数据库中(如果该 ID 不存在)并且不会调用序列。尝试查看触发器的代码以准确了解它发生了什么。

关于java - Hibernate、id、oracle、序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331005/

相关文章:

java - 在 Hibernate 中,StatelessSession 在有 EAGER JOIN 时防止过滤掉重复项

java - 无法以编程方式添加到 JPanel

java - StringBuffer 如何通过类中没有字段的空隙传递数据?

java - 在java中使用正则表达式组

sql - 使用 CTE 的奇怪结果

java - 如何在 Spring Boot 1.5.1 Hibernate 中防止隐式缓存

java - org.springframework.beans.factory.UnsatisfiedDependencyException : Error creating bean

java - Spring 启动: Re-use code in another project

sql - 填补缺失数据 Oracle

oracle - 从过程中调用带有表参数的函数时出现编译错误