我发现了一个关于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") })