休眠序列生成器请求2个值



我发现了一个关于Hibernate序列生成器的奇怪案例。当我用存储库保存实体时,Hibernate会执行两个查询。

select nextval ('some_sequence')
select nextval ('some_sequence')

是一些Hibernate预缓存行为吗?它可以调谐吗?

这是实体:

@Entity
@Getter
@Setter
@Table(name = "host_black_list")
public class RestrictedHost {
@Id
@GeneratedValue(
strategy = SEQUENCE,
generator = "restricted_host_generator"
)
@SequenceGenerator(
name = "restricted_host_generator",
sequenceName = "some_sequence"
)
@Column(name = "host_black_list_id")
private Long id;
@Column(name = "host_name")
@NotNull
private String name;
@Column(name = "msisdn_count")
@NotNull
private long msisdnCount;
}

这是测试代码:

final var id = transactionTemplate.execute(status -> {
RestrictedHost restrictedHost = new RestrictedHost();
restrictedHost.setName("some_name");
restrictedHost.setMsisdnCount(156);
final var host = restrictedHostRepository.saveAndFlush(restrictedHost);
return host.getId();
});

我使用Testcontainers+PostgreSQL 9.6.8

Yes hibernate默认方式缓存seq值。

默认缓存值为50。但我不认为它运行一个seq查询两次。

persistence.xml:该设置表示旧样式或新样式的序列使用

<property name="hibernate.id.new_generator_mappings" value="false"/>

如果您使用GenericGenerator,那么它在没有缓存的情况下工作,所以所有持久化都会获取一个seq值!

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "some_seq_generator")
@GenericGenerator(name = "some_seq_generator", strategy = "sequence", parameters = { @Parameter(name = "sequence", value = "some_seq") })

最新更新