一尘不染

Hibernate,id,oracle,序列

hibernate

我的数据库是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)

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


阅读 182

收藏
2020-06-20

共1个答案

一尘不染

我还有一个projet,其中有一个Oracle
DB将数据提供给我的@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触发器中没有对触发器的调用,因为触发器是由数据库管理的。我记得如果我不想遇到问题,必须在数据库中同时拥有序列和触发器。触发器询问要插入的行的id是null还是=0。在这种情况下,将调用LOG_SEQ序列。

因此,如果您为实体的@Id提供值,则可以将其插入数据库(如果该ID不存在),则不会调用该序列。尝试查看触发器的代码以确切了解其发生的情况。

2020-06-20