当Hibernate已经在另一个模式

时间:2017-11-23 17:58:03

标签: spring hibernate jpa

我有一个带有单个数据源的“简单”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"
                )
        })

现在我的问题如下:

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

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

我还尝试将序列手动添加到缺少的架构中,但遗憾的是似乎没有帮助。

1 个答案:

答案 0 :(得分:0)

如果手动将序列添加到架构中。 您可以使用defaultSchema

创建CustomIdGenerator类作为返回序列ID的示例
 addName.call(creatures, 'goblin');

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

  

NEXTVAL:递增序列并返回下一个值

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);

    }
}

并且您的实体只是编辑策略以使用CustomGenerator Class

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