当前位置: 首页 > 知识库问答 >
问题:

“Basic”属性类型不应为容器;对于基于属性的访问,setter和getter都应该存在

邢寒
2023-03-14

我是Spring启动的新手。我尝试使用Spring Security和Hibernate实现登录和注册功能。

首先,我使用Hibernate从数据库生成持久性映射实体类。我需要在UserEntity类中实现UserDetails接口,但问题发生了。

我无法在UserDetails中实现这些方法。

尝试实现GetAuthories时出错。以下是错误信息。

“Basic”属性类型不应是容器。检查信息:此检查检查是否存在以下JPA规范错误:

  • 属性类型检查(集合、实体、可嵌入等)

对于基于属性的访问,应该同时存在setter和getter检查信息:此检查检查以下JPA规范错误:

  • 为方法/字段配置了多个属性

这是我的密码。

package com.example.demo;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;

@Entity
@Table(name = "user", schema = "demo", catalog = "")
public class UserEntity implements UserDetails {
    private String username;
    private String password;
    private String role;
    private String nickname;
    private String phone;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities(){
        String[] authorities=role.split(",");
        List<SimpleGrantedAuthority> authorityList=new ArrayList<>();
        for(String string:authorities)
            authorityList.add(new SimpleGrantedAuthority(string));
        return authorityList;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    @Id
    @Column(name = "username", nullable = false, length = 16)
    @Override
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Basic
    @Column(name = "password", nullable = true, length = 32)
    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Basic
    @Column(name = "nickname", nullable = true, length = 32)
    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    @Basic
    @Column(name = "phone", nullable = true, length = 11)
    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserEntity that = (UserEntity) o;
        return Objects.equals(username, that.username) &&
                Objects.equals(password, that.password) &&
                Objects.equals(nickname, that.nickname) &&
                Objects.equals(phone, that.phone);
    }

    @Override
    public int hashCode() {
        return Objects.hash(username, password, nickname, phone);
    }
}

我创建了一个与UserEntity完全相同的类,实现了UserDetails,问题消失了。也许这有点愚蠢,但我已经试过很多次了。我解决不了。请帮忙。

共有2个答案

芮化
2023-03-14

在JPA中,当一个对象引用另一个对象或对象组时,应指定两者之间的关系。例如:

@Entity
class Parent {
  // you should tell the JPA how to treat this collection
  Set<Child> children
}

正如@Zon所述,您可以跳过保存它(@Transient)或将子项另存为另一个实体,并定义两者之间的关系(@oneToMany)或您忽略它(@Transient)或将其以二进制格式保存为blob(@Lob)。

邬宏扬
2023-03-14

请尝试使用OneToMany或Transient注释,而不是Basic注释。

 类似资料:
  • 我不明白为什么我必须对类中的私有属性使用getter或setter。

  • 我在我的项目中使用Spring数据JPA。当实体被保存或更新时,我想跟踪CreatedBy和LastModifiedBy,以了解哪个用户执行该活动。但我面临的问题是,我有两种不同类型的用户。这些是系统用户和加油机。这两种用户类型都有权在任何实体中执行CRUD操作。 另一件事是,我见过大多数示例将和作为字符串字段保存。但问题是从数据库中检索数据时,他们将检索为用户ID(字符串值)。我需要将用户ID存

  • 有两种类型的对象属性。 第一种是 数据属性。我们已经知道如何使用它们了。到目前为止,我们使用过的所有属性都是数据属性。 第二种类型的属性是新东西。它是 访问器属性(accessor properties)。它们本质上是用于获取和设置值的函数,但从外部代码来看就像常规属性。 Getter 和 setter 访问器属性由 “getter” 和 “setter” 方法表示。在对象字面量中,它们用 get

  • 问题内容: 我正在制作一个使用Drools规划器的应用程序。 该假设指代属性从另一个类(在这种情况下)。从JavaDocs中获取@ValueRangeFromSolutionProperty: 但我注意到一个 矛盾 :在注释使用属性的。但是(与相对)是一个私有变量(请参见下面的代码段)。如果应该 通过自省 (通过它的getter和setter方法) 推断属性, 则是否应将其拼写为? 问题: Jav

  • 问题内容: 如何给定的属性的值? 问题答案: 有称为和的内置函数 在这种情况下

  • 如何使类示例推断类型基于实例值检查: 打字沙盒。