【问题标题】:Error: AnnotationException: mappedBy reference an unknown target entity property错误:AnnotationException:mappedBy 引用了未知的目标实体属性
【发布时间】:2018-01-17 21:58:10
【问题描述】:

我正在使用 JPA PostgreSQL 创建 Spring Boot 应用程序。

当我编译我的 spring 项目时,出现以下错误。

org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class] 中定义名称为“entityManagerFactory”的 bean 创建错误:调用 init 方法失败;嵌套异常是 org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: eveserver.core.entity.Role.users 中的 eveserver.core.entity.User.name

请帮助我理解我做错了什么。

这是我的User.java

package eveserver.core.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;

@Entity
@Table(name = "users")
public class User implements Serializable {
    @Id
    @GeneratedValue
    private Long id;
    @Column(name = "name")
    private String username;
    @JsonIgnore
    @Column(name = "password")
    private String password;
    @Column(name = "email")
    private String email;
    private boolean enabled = false;


    @ManyToMany
    @JoinTable(name = "user_role",
            joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    private Set<Role> roles;

    public User(){ }

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public User(String username, String password, String email, Set<Role> roles) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.roles = roles;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    public void enable(){
        enabled = true;
    }
    public void disable(){
        enabled = false;
    }

}

Role.java

package eveserver.core.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.security.core.GrantedAuthority;

import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "role")
public class Role  implements GrantedAuthority {
    @Id
    @GeneratedValue
    private Long id;
    private String name;

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

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj){
        if (obj instanceof Role){
            Role r = (Role)obj;
            if (r.getId()==this.getId()){
                return true;
            }
        }
        return false;
    }

    public Set<User> getUsers() {
        return users;
    }

    public void setUsers(Set<User> users) {
        this.users = users;
    }

    @Override
    public String getAuthority() {
        return getName();
    }
}

这是我的表格

【问题讨论】:

标签: java spring postgresql hibernate jpa


【解决方案1】:

在您的 User 类中,您有一个名为 roles 的属性:

public Set<Role> getRoles() {
    return roles;
}

在您的 Role 课程中,这个:

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

应该是:

@ManyToMany(mappedBy = "roles")
@JsonIgnore
private Set<User> users;

mappedBy = "something" 实际上是在说,“在这个其他实体中,有一个名为 something 的属性获取 此类型 的实体列表(您在您使用@ManyToMany 注释)。它不指定类型或类名,如Role。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 2019-03-26
    • 2022-01-13
    相关资源
    最近更新 更多