“long 类型的错误值”映射多对多关系时在 Hibernate 中出错

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

我在开发使用 Hibernate 进行 ORM 的 Spring Boot 应用程序时遇到问题。

Could not extract column [3] from JDBC ResultSet [Bad value for type long : Allows creating new projects] [n/a]"

**我有以下数据库表: **

  1. 角色表:包含角色ID(长)和名称(字符串)。

  2. 权限表:包含权限ID(长)、描述(文本)和权限(字符串)。

  3. Role_Permission 表:将角色 ID 链接到权限 ID 的多对多映射表。

这是角色实体中的设置

@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @Column(name = "name", nullable = false, unique = true)
    private String name;

    @ManyToMany
    @JoinTable(
        name = "role_permission",
        joinColumns = @JoinColumn(name = "role_id"),
        inverseJoinColumns = @JoinColumn(name = "permission_id")
    )
    private Set<Permission> permissions;

    @OneToMany(mappedBy = "role")
    private Set<User> users;

这是权限实体

@Entity
@Table(name = "permissions")
public class Permission {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    @Column(name = "permission", nullable = false)
    private String permission;

    @Lob
    @Column(name = "description", nullable = true, columnDefinition = "text")
    private String description;

    @ManyToMany(mappedBy = "permissions")
    private Set<Role> roles;

相关用户实体代码

@ManyToOne
    @JoinColumn(name = "role_id", nullable = false)
    private Role role;
User newUser = new User();
            newUser.setUsername(registrationDto.getUsername());
            newUser.setEmail(registrationDto.getEmail());
            newUser.setPassword(bCryptPasswordEncoder.encode(registrationDto.getPassword()));
            newUser.setRole(roleRepository.findByName(registrationDto.getRole()));

            Role manager = newUser.getRole();

我认为问题是没有加载权限,而是有 PersistanceSet 对象并且它已设置= null

我尝试过 FetchType.EAGER 加载,但它没有改变任何东西。我不明白为什么它获取具有给定角色的所有用户而不是单个权限。

是的,我的 role_permission 表已正确填充:D

ps:抱歉,如果这篇文章的格式错误,这是我在这里发表的第一篇文章。

java spring jpa hibernate-mapping
1个回答
0
投票

将原始 long 更改为包装器 Long 以实现空安全,然后更改角色和权限类中的关联(还可以初始化集合以避免空集):

许可实体:

  @ManyToMany(mappedBy = "permissions", fetch = FetchType.LAZY)
  private Set<Role> roles = new HashSet<>(); 

角色实体:

 @OneToMany(mappedBy = "role", fetch = FetchType.LAZY)
 private Set<User> users = new HashSet<>();
© www.soinside.com 2019 - 2024. All rights reserved.