我在尝试将具有角色的新用户插入 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
我发现 Hibernate 在使用属性 spring.jpa.hibernate.ddl-auto=update 时不更新数据库中的 Enum 值的问题。最初,我在
@Enumerated(EnumType.STRING)
类中定义角色字段时没有指定 UserEntity
。这导致枚举值在数据库中存储为 oid 而不是字符串,从而导致错误。
要解决该错误,我必须采取以下步骤:
@Enumerated(EnumType.STRING)
定义重新运行服务器
角色场。这种方法为我解决了这个问题。然而,值得注意的是,这个解决方案并不理想,因为它涉及删除整个数据库并重新开始。使用
Enum
时,Hibernate 对 spring.jpa.hibernate.ddl-auto=update
值的处理似乎可能存在问题。