java 类型byte的值不正确-postgres、spring、JPA

jv4diomz  于 2023-06-28  发布在  Java
关注(0)|答案(2)|浏览(123)

我想用这个模式在Postgres中存储实体

CREATE TABLE IF NOT EXISTS Ingredient
(
    id   VARCHAR(4)  NOT NULL PRIMARY KEY,
    name VARCHAR(25) NOT NULL,
    type VARCHAR(10) NOT NULL
);

这就是Java模型

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PUBLIC, force = true)
public class Ingredient {
    @Id
    private final String id;
    private final String name;

    private final Type type;

    public enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }
}

下面是代码

@Profile("!prod")
@Configuration
public class DevelopmentConfig {
    @Bean
    public CommandLineRunner dataLoader(
            IngredientRepository ingredientRepo,
    ) {
        return args -> {
            Ingredient flourTortilla = new Ingredient(
                    "FLTO", "Flour Tortilla", Type.WRAP);
            ingredientRepo.save(flourTortilla);
            
        };
    }
}

我收到此错误-原因:org.hibernate.exception.DataException:无法从JDBC ResultSet [Bad value for type byte:WRAP]

**原因:org.postgresql.util.PSQLException:类型byte的错误值: Package **

任何建议都很感激。
我已经尝试研究这个错误,但没有找到答案,我已经尝试定义列数据类型,但它仍然没有工作

hmmo2u0o

hmmo2u0o1#

最有可能的问题是Spring默认情况下使用它们的序数值(数字)而不是它们的String值来存储Enum。您可以尝试以下操作:

private final String name;

@Enumerated(EnumType.STRING)
private final Type type;
swvgeqrz

swvgeqrz2#

Hibernate正在尝试将枚举转换为字节类型默认情况下,但枚举的值是字符串,而不是字节,因此您需要指定希望将枚举持久化为String,使用@Enumerated

@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PUBLIC, force = true)
public class Ingredient {
    @Id
    private final String id;
    private final String name;

    @Enumerated(EnumType.STRING)
    private final Type type;

    public enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
    }
}

阅读更多:https://thorben-janssen.com/hibernate-enum-mappings/

相关问题