【问题标题】:How to get the correct ID after saving a Hibernate object?保存 Hibernate 对象后如何获取正确的 ID?
【发布时间】:2017-12-11 11:17:13
【问题描述】:
我正在使用 Hibernate 和 Oracle。我想保存一个对象并获取它的 ID,它是由使用序列的触发器生成的。 (使用触发器是一个要求。)有两种方法可以获取我目前可以使用的 ID:1)找到 ID 列的最大值; 2) 找到序列的当前值。两种方法都存在相同的问题,即在保存此对象和获取 ID 之间可能会发生另一次插入。 如何避免此类不合时宜的插入?
此外,这两个事件发生在获取 ID 后不会结束的事务中。换句话说,之后会有事情发生。因此,如果我锁定表,则在事务结束之前不会释放锁定。这是不可接受的。
【问题讨论】:
标签:
oracle
hibernate
insert
【解决方案1】:
如果您为您的实体使用序列 id generation strategy,您应该通过以下方式解决此问题:
1)您可以指定allocationSize,它将预先为您分配一定数量的ID,并在特定交易中可供您使用。
2) 一旦您调用session.save(entity) 或entityManager.persist(entity),ID 将在调用后立即提供给您,无需等到事务方法结束和实际的flush 和commit。