我的数据库是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)
真的很困惑,有人可以阐明这个问题吗?请清楚解释。
我还有一个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不存在),则不会调用该序列。尝试查看触发器的代码以确切了解其发生的情况。