【问题标题】:Hibernate does not generate Sequence when it's already available on a different schema当序列已经在不同的模式上可用时,Hibernate 不会生成序列
【发布时间】:2018-05-07 18:09:03
【问题描述】:

我有一个带有单个数据源的“简单”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”上创建序列。

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

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

【问题讨论】:

    标签: spring hibernate jpa


    【解决方案1】:

    如果您手动将序列添加到架构中。 您可以创建 CustomIdGenerator 类作为默认模式返回序列 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:递增序列并返回下一个值

    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;
    

    【讨论】:

    • 我真的需要 CustomIdGenerator 吗?我很想知道为什么这种天真的方法不像我所做的那样奏效。
    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 2010-12-16
    • 2020-04-11
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多