【问题标题】:How to use JpaMessageIdRepository in Spring Boot?如何在 Spring Boot 中使用 JpaMessageIdRepository?
【发布时间】:2020-11-15 01:53:36
【问题描述】:

我正在尝试让 JpaMessageIdRepository 在我的 Spring Boot 2.3 项目中工作,但无济于事。这是函数 jpaMessageIdRepository 中的第一个参数,看起来像这样让我感到困惑。

jpaMessageIdRepository(String persistenceUnit, String processorName) 
jpaMessageIdRepository(EntityManagerFactory entityManagerFactory, String processorName)

我应该使用哪一个?以及如何从我的班级中获取 entityManagerFactory?似乎在任何地方都找不到一个可行的例子:(

这是来自我的骆驼路线,它不起作用:

        .idempotentConsumer(
                header("CamelFileName"),
                jpaMessageIdRepository("what", "FileRepo")
        )
        .log("${header.CamelFileName}")

【问题讨论】:

    标签: spring spring-boot apache-camel spring-camel


    【解决方案1】:

    您可以注入 EntityManagerFactory

    @Autowired
    private EntityManagerFactory emf;
    

    然后使用它:

    .idempotentConsumer(
                header("CamelFileName"),
                jpaMessageIdRepository(emf, "FileRepo")
        )
        .log("${header.CamelFileName}")
    

    【讨论】:

    • 我明白了:[host:2222/files/] o.hibernate.hql.internal.QuerySplitter:没有找到查询类的持久类:从 org.apache.camel.processor.idempotent 中选择 x .jpa.MessageProcessed x where x.processorName = ?1 and x.messageId = ?2 oacpijpa.JpaMessageIdRepository 尝试将消息添加到存储库时出错{} java.lang.IllegalArgumentException:找不到序数参数 [1],期待org.hibernate.query.internal.ParameterMetadataImpl.getOrdinalParameterDescriptor(ParameterMetadataImpl.java:154) 的 [] 之一~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    • 看起来 spring boot 不会自动创建表格 :(
    【解决方案2】:

    我已经成功地使用 spring-boot 2.5.4、camel 3.13.0 和 hibernate 5.4.32.Final 运行它。我不确定这是不是最好的方法,但是关于这个主题的文档很差。

    这里没有提到创建sql表https://camel.apache.org/components/3.13.x/jpa-component.html#_spring_boot_auto_configuration 但在https://camel.apache.org/components/3.13.x/sql-component.html 上找到了一些有用的信息

    Maven 依赖项

    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-spring-boot-starter</artifactId>
        <version>3.13.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel.springboot</groupId>
        <artifactId>camel-jpa-starter</artifactId>
        <version>3.13.0</version>
    </dependency>
    

    创建sql表和序列

    CREATE TABLE CAMEL_MESSAGEPROCESSED
    (
        id             number(38) primary key not null,
        processor_name VARCHAR(255),
        message_id     VARCHAR(100),
        created_at     TIMESTAMP
    );
    
    create sequence hibernate_sequence start with 1 increment by 50;
    

    Jpa 实体配置(spring bean)包含实体org.apache.camel.processor.idempotent.jpa.MessageProcessed

    import org.springframework.boot.autoconfigure.domain.EntityScan;
    import org.springframework.context.annotation.Configuration;
    
    @EntityScan(basePackages = {
            "project.base.package.to.do",
            "org.apache.camel.processor.idempotent.jpa"
    })
    @Configuration
    class JpaEntityConfiguration {
    }
    

    创建 JpaMessageIdRepository。处理器名称应更改。 EntityManagerFactory 是从 spring 上下文自动装配的。

    private JpaMessageIdRepository createJpaMessageIdRepository(EntityManagerFactory entityManagerFactory) {
        return JpaMessageIdRepository.jpaMessageIdRepository(entityManagerFactory, "helloSOProcessor");
    }
    

    覆盖 id 生成策略(仅当您使用带有名称的序列而不是其他 hibernate_sequence 并且不想创建 hibernate_sequence 时)。在 META-INF 下创建 orm.xml

    <entity-mappings>
        <entity class="org.apache.camel.processor.idempotent.jpa.MessageProcessed" name="MessageProcessed">
            <attributes>
                <id name="id">
                    <generated-value strategy="sequence" generator="sequenceGenerator"/>
                </id>
            </attributes>
        </entity>
    </entity-mappings>
    

    【讨论】:

      猜你喜欢
      • 2021-06-19
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多