将具有 Enum 角色的用户插入 PostgreSQL 数据库时出错

问题描述 投票:0回答:1

我在尝试将具有角色的新用户插入 PostgreSQL 数据库时遇到问题。我有一个 Spring Boot 应用程序,其中用户由 UserEntity 类表示,每个用户都有一个由名为 Role 的枚举定义的角色。

这是我的

UserEntity
课程的简化版本:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "users")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String username;
    private String password;

    @Column(nullable = true)
    private String email;
    @Column(nullable = true)
    private String tel;
    @Enumerated(EnumType.STRING)
    @Column(columnDefinition = "VARCHAR(255)")
    private Role role;
  }

角色枚举定义如下:

public enum Role {
    ADMIN,
    VENDEUR
}

当我尝试保存具有角色的新用户时,遇到以下错误:

Internal Server Error",
  "trace": "org.springframework.dao.DataIntegrityViolationException: could not execute statement [ERREUR: syntaxe en entrée invalide pour le type oid : « VENDEUR »] [insert into users (email,password,role,tel,username,id) values (?,?,?,?,?,?)]; SQL [insert into users (email,password,role,tel,username,id) values (?,?,?,?,?,?)]

我已经验证我的 PostgreSQL 数据库中角色的列类型是 VARCHAR。我还确保在插入用户时使用正确的枚举值 (Role.VENDEUR)。

什么可能导致此错误,如何解决?任何见解或建议将不胜感激。谢谢!

我使用Spring boot

3.2.2

postgresql spring-boot hibernate orm mapping
1个回答
0
投票

我发现 Hibernate 在使用属性 spring.jpa.hibernate.ddl-auto=update 时不更新数据库中的 Enum 值的问题。最初,我在

@Enumerated(EnumType.STRING)
类中定义角色字段时没有指定
UserEntity
。这导致枚举值在数据库中存储为 oid 而不是字符串,从而导致错误。

要解决该错误,我必须采取以下步骤:

  • 删除现有数据库。
  • 创建一个新的空数据库。
  • 使用
    @Enumerated(EnumType.STRING)
    定义重新运行服务器 角色场。

这种方法为我解决了这个问题。然而,值得注意的是,这个解决方案并不理想,因为它涉及删除整个数据库并重新开始。使用

Enum
时,Hibernate 对
spring.jpa.hibernate.ddl-auto=update
值的处理似乎可能存在问题。

© www.soinside.com 2019 - 2024. All rights reserved.