gpt4 book ai didi

spring - 当 Hibernate 在不同的模式上已经可用时,它不会生成 Sequence

转载 作者:行者123 更新时间:2023-12-03 21:26:45 26 4
gpt4 key购买 nike

我有一个带有单个数据源的“简单”Spring Boot 应用程序。
我的配置中存在以下配置:

spring:
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
default_schema: CORE
flyway:
schemas:
- CORE

和以下 ID 生成器
@Id
@GeneratedValue(strategy = SEQUENCE, generator = "seq-pooled-lo")
@GenericGenerator(
name = "seq-pooled-lo",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@org.hibernate.annotations.Parameter(
name = SequenceStyleGenerator.INCREMENT_PARAM,
value = "50"
),
@org.hibernate.annotations.Parameter(
name = SequenceStyleGenerator.OPT_PARAM,
value = "pooled"
),
@org.hibernate.annotations.Parameter(
name = SequenceStyleGenerator.SEQUENCE_PARAM,
value = "seq_pooled_lo_sequence"
)
})

现在我的问题如下:

当我启动这个应用程序时,它会在“核心”模式上创建一个序列。一切正常。存储、检索数据没有问题。当我启动应用程序的第二个实例但覆盖 YAML 文件以定义不同的 default_schema: SECOND 时它不会在“SECOND”模式上生成新序列。如果我首先使用定义的“SECOND”模式启动应用程序,然后使用“CORE”启动应用程序,它将在“SECOND”模式而不是“CORE”上创建序列。

我希望它在两个模式上创建不同的序列。为什么不这样做?

我还尝试将序列手动添加到它丢失的模式中,但遗憾的是这似乎没有帮助。

最佳答案

如果您手动将序列添加到架构中。
您可以创建 CustomIdGenerator 类作为 defaultSchema 返回序列 id 的示例

public class CustomIdGenerator implements IdentifierGenerator {

@Override
public Serializable generate(SessionImplementor sessionImplementor, Object o) throws HibernateException {
SequenceRepository sequenceRepository = ApplicationContextProvider.getApplicationContext().getBean(SequenceRepository.class);
Environment env = ApplicationContextProvider.getApplicationContext().getBean(Environment.class);

String defaultSchema = env.getProperty("yourproperty.default_schema");

return sequenceRepository.getSequence(defaultSchema);

}
}

让我们创建 SequenceRepository 类来生成序列。我假设我的数据库是 Oracle。

NEXTVAL: Increments the sequence and returns the next value


public interface SequenceRepository extends JpaRepository<Object,Long> {
@Query(value = "SELECT ?1.NEXTVAL FROM DUAL", nativeQuery = true)
Long getSequence(String sequenceName);
}

并且您的实体只需将策略编辑为使用 CustomGenerator 类
@Id
@GenericGenerator(name = "sequence_generator", strategy = "yourpackage.CustomIdGenerator")
@GeneratedValue(generator = "sequence_generator")
@Column(name = "id")
private Long id;

关于spring - 当 Hibernate 在不同的模式上已经可用时,它不会生成 Sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47461203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com