spring-boot - 是否可以将 Snowflake 与 Spring Boot/JPA/Hibernate 一起使用

标签 spring-boot hibernate jpa spring-data-jpa snowflake-cloud-data-platform

我正在创建一个直接写入雪花数据库的服务。 我在尝试让 spring data jpa 与 Snowflake 有效工作时遇到了很多麻烦。我的主要问题是我无法通过 Jpa Repository 接口(interface) Save 方法将实体保存到 Snowflake DB。因为此应用程序用于将数据转储到 Snowflake 中,所以能够利用 JPA 将使生活变得更加轻松。

我不想滚动自己的 native 查询,所以我的问题是在使用 Snowflake 时是否可以利用 Hibernate。

我希望能够做的主要事情是使用 Jpa Repositories inbuild Save 方法持久化实体。

以下是我当前的配置。任何关于可以在配置中改进什么以实现此工作的想法,或者关于它是否可能的任何意见都将不胜感激。

spring:
  profiles:
    active: local
  application:
    name: Service
  datasource:
    driverClassName: net.snowflake.client.jdbc.SnowflakeDriver
    url: ${SPRING_DATASOURCE_URL}
    username: ${SPRING_DATASOURCE_USERNAME}
    password: ${SPRING_DATASOURCE_PASSWORD}
  flyway:
    locations: classpath:db/migration/common,classpath:db/migration/snowflake
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.SQLServerDialect
        order_inserts: true
create sequence award_event_id_seq;
create table award_event
(
    id INT NOT NULL DEFAULT award_event_id_seq.nextval PRIMARY KEY,
    event_source_system                    varchar        not null,
    event_trigger                          VARCHAR        NOT NULL,
    event_triggered_by                     VARCHAR        NOT NULL,
    event_timestamp                        TIMESTAMP      NOT NULL
)
@Entity(name = "award_event")
@SequenceGenerator(name = "award_event_id_seq", sequenceName = "award_event_id_seq", allocationSize = 1)
data class AwardEvent(

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    val id: Int = -1,

    val eventTrigger: String,
    val eventTriggeredBy: String,
    val eventTimestamp: LocalDateTime,
    val eventSourceSystem: String
)
override fun receiveMessage(message: String) {
        logger.info("Receiving award event: $message")
        val awardEvent: AwardEventMessage = message.toObject()
        // This Save method does not work and throws an error specified below
        awardEventRepository.save(awardEvent.toAwardEvent())
    }
2021-01-08 10:49:28.163 ERROR 3239 --- [nio-9106-exec-1] o.hibernate.id.enhanced.TableStructure   : could not read a hi value

net.snowflake.client.jdbc.SnowflakeSQLException: SQL compilation error:
syntax error line 1 at position 50 unexpected 'with'.
syntax error line 1 at position 72 unexpected ')'.
    at net.snowflake.client.jdbc.SnowflakeUtil.checkErrorAndThrowExceptionSub(SnowflakeUtil.java:124)
    at net.snowflake.client.jdbc.SnowflakeUtil.checkErrorAndThrowException(SnowflakeUtil.java:64)
    at net.snowflake.client.core.StmtUtil.pollForOutput(StmtUtil.java:434)
    at net.snowflake.client.core.StmtUtil.execute(StmtUtil.java:338)
    at net.snowflake.client.core.SFStatement.executeHelper(SFStatement.java:506)
    at net.snowflake.client.core.SFStatement.executeQueryInternal(SFStatement.java:233)
    at net.snowflake.client.core.SFStatement.executeQuery(SFStatement.java:171)
    at net.snowflake.client.core.SFStatement.execute(SFStatement.java:754)
    at net.snowflake.client.jdbc.SnowflakeStatementV1.executeQueryInternal(SnowflakeStatementV1.java:245)
    at net.snowflake.client.jdbc.SnowflakePreparedStatementV1.executeQuery(SnowflakePreparedStatementV1.java:117)

最佳答案

作为后续行动,我无法使用上面概述的方法启动和运行应用程序。我仍然不确定为什么,但认为这可能与缺乏对雪花序列作为 Spring 主键生成类型的支持有关。

我将生成类型更改为UUID,应用程序开始按预期运行。对于需要什么类型的主键没有要求,所以这种方法是令人满意的。

create sequence award_event_id_seq;
create table award_event
(
    id varchar not null constraint award_event_pkey primary key,
    event_source_system                    varchar        not null,
    event_trigger                          varchar        not null,
    event_triggered_by                     varchar        not null,
    event_timestamp                        timestamp      not null
)
@Entity(name = "award_event")
data class AwardEvent(

    @Id
    @GeneratedValue
    @Type(type = "uuid-char")
    val id: UUID = UUID.randomUUID(),

    val eventTrigger: String,
    val eventTriggeredBy: String,
    val eventTimestamp: LocalDateTime,
    val eventSourceSystem: String
)

关于spring-boot - 是否可以将 Snowflake 与 Spring Boot/JPA/Hibernate 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65628872/

相关文章:

java - 初始化受 Spring 身份验证保护的存储库

java - 使用 ssl 证书和 feign

java - Hibernate 注解映射、JPA 孤儿删除

java - 将延迟初始化对象设置为 null,而对象在 jpa 中使用 hibernate 代理

java - @javax.persistence.Column(可更新=假)

java - Spring Boot - .bash_profile 的 application.properties 中的 JAVA_OPTS?

spring-boot - 结合非阻塞和阻塞调用并在 Spring Webflux 中返回结果

java - JPA @JoinTable - 三个 ID 列

java - Hibernate:从部分解析/翻译 HQL 以获取对类别名、类名

java - 面向 future 的 SQL 表?