使用interval数据类型时无法构建Hibernate SessionFactory

cetgtptt  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(143)

我正在我的实体类中添加下面的列

@NonNull
@Column(name = "interval_value", nullable = false)
@Type(PostgreSQLIntervalType.class)
private Duration intervalValue;

当我使用

spring.jpa.hibernate.ddl-auto: create
  database-platform: org.hibernate.dialect.PostgreSQLDialect

我在SQL中得到错误
无法生成Hibernate SessionFactory;嵌套异常为org.hibernate.MappingException:为表创建SQL创建命令时出错:
模块pom.xml

<dependency>
        <groupId>io.hypersistence</groupId>
        <artifactId>hypersistence-utils-hibernate-62</artifactId>
        <version>3.5.0</version>
    </dependency>
   <dependency>
        <groupId>jakarta.validation</groupId>
        <artifactId>jakarta.validation-api</artifactId>
    </dependency>
   <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.6.0</version>
    </dependency>

根pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.1</version>
    <relativePath /> 
 </parent>

如何使用spring jpa实体添加间隔列?

ax6ht2ek

ax6ht2ek1#

看起来您正在尝试使用Duration类型。问题是PostgreSQL本身不支持Duration类型。当您使用@Type(PostgreSQL IntervalType.class)注解时,Hibernate可能无法正确地将Duration类型Map到PostgreSQL间隔类型。
要解决这个问题,您可能需要自己处理Duration类型的Map,可能是将其转换为PostgreSQL可以理解的适当格式。
以下是您可以考虑的一般方法:
1-创建一个自定义属性转换器,在PostgreSQL可以处理的Duration和String表示之间进行转换。

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import java.time.Duration;

@Converter
public class DurationToStringConverter implements AttributeConverter<Duration, String> {

@Override
public String convertToDatabaseColumn(Duration attribute) {
    return attribute.toString(); // Convert Duration to a format PostgreSQL understands
}

@Override
public Duration convertToEntityAttribute(String dbData) {
    return Duration.parse(dbData); // Convert back from the PostgreSQL format to Duration
 }
}

2 -将自定义属性转换器应用于实体类中的intervalValue字段。

@Entity
public class YourEntity {
// ...

@NonNull
@Column(name = "interval_value", nullable = false)
@Convert(converter = DurationToStringConverter.class)
private Duration intervalValue;

// ... 
}

通过使用这个自定义属性转换器,您可以有效地将Duration类型转换为PostgreSQL可以处理的String表示,然后在从数据库检索时将其转换回Duration。

相关问题