我正在使用Hibernate和Oracle。我想保存一个对象并获取其ID,该ID由使用序列的触发器生成。 (需要使用触发器。)有两种方法可以获取当前使用的ID:1)找到ID列的最大值; 2)找到序列的当前值。两种方法都遇到同样的问题,即在保存此对象和获取ID之间可能发生另一次插入。 如何避免这种不合时宜的插入?
此外,这两个事件发生在获取ID后未结束的事务中。换句话说,事后会发生一些事情。因此,如果我锁定表,则在事务结束之前不会释放锁。这是不可接受的。
答案 0 :(得分:0)
如果您为您的实体使用序列标识generation strategy,则应该克服此问题:
1)您可以指定allocationSize
,它会为您预先分配一定数量的ID,并在特定交易中为您提供。
2)拨打session.save(entity)
或entityManager.persist(entity)
后,您可以在通话结束后立即使用该ID,而无需等到结束时交易方法和实际的flush
和commit
。