【问题标题】:Spring Boot + JPA: "Unable to locate Attribute with the given name" in a derived classSpring Boot + JPA:派生类中的“无法找到具有给定名称的属性”
【发布时间】:2019-06-23 17:25:42
【问题描述】:

我正在开发一个使用 Spring Boot + JPA 来保存一些实体的应用程序。然而,这些实体(当然还有 Spring 配置)是应用程序中唯一依赖 Spring/JPA 的东西。这就是我们想要将应用程序拆分为两个组件的原因。应该独立于 Spring 和任何与 JPA 相关的东西和 Spring 应用程序的核心应用程序。为此,我们在核心应用程序中创建了实体的接口和基本实现,并在 Spring 应用程序中创建了仅覆盖 getter 并使用属性访问的派生实现。但是现在 Spring 抱怨这些字段不存在。

这里是核心应用中的类,基本上就是一堆getter和setter:

public class UserImpl implements User {

protected Set<UserProfile> userProfiles = new HashSet<>();

protected Set<Playlist> playlists = new HashSet<>();

protected String userName;
protected String password;
protected String securityQuestion;
protected String securityQuestionAnswer;
protected String token;

public UserImpl() {
}

public UserImpl(String userName) {
    this.userName = userName;
}

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 getSecurityQuestion() {
    return securityQuestion;
}

public void setSecurityQuestion(String securityQuestion) {
    this.securityQuestion = securityQuestion;
}

public String getSecurityQuestionAnswer() {
    return securityQuestionAnswer;
}

public void setSecurityQuestionAnswer(String securityQuestionAnswer) {
    this.securityQuestionAnswer = securityQuestionAnswer;
}

public void setUserProfiles(Set<UserProfile> userProfiles) {
    this.userProfiles = userProfiles;
}

public List<UserProfile> getUserProfiles() {
    return new ArrayList<>(userProfiles);
}

public void setToken(String token) {
    this.token = token;
}

public String getToken() {
    return token;
}

public void setPlaylists(Set<Playlist> playlists) {
    this.playlists = playlists;
}

public Set<Playlist> getPlaylists() {
    return playlists;
}

}

这里是派生类:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name = "users", schema = "musictinder")
public class JPAUserImpl extends UserImpl {

@Id @GeneratedValue private long id;

public long getId() {
    return id;
}

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

@Override
@Column(name = "user_name")
@AccessType(AccessType.Type.PROPERTY)
public String getUserName() {
    return super.getUserName();
}

@Override
@Column(name = "password")
@AccessType(AccessType.Type.PROPERTY)
public String getPassword() {
    return super.getPassword();
}

@Override
@Column(name = "security_question")
@AccessType(AccessType.Type.PROPERTY)
public String getSecurityQuestion() {
    return super.getSecurityQuestion();
}

@Override
@Column(name = "security_question_answer")
@AccessType(AccessType.Type.PROPERTY)
public String getSecurityQuestionAnswer() {
    return super.getSecurityQuestionAnswer();
}

@Override
@Column(name = "token")
@AccessType(AccessType.Type.PROPERTY)
public String getToken() {
    return super.getToken();
}

@Override
@ElementCollection
@OneToMany(cascade = CascadeType.ALL)
@AccessType(AccessType.Type.PROPERTY)
public Set<Playlist> getPlaylists() {
    return super.getPlaylists();
}

@Override
@ElementCollection
@OneToMany(cascade = CascadeType.ALL)
@AccessType(AccessType.Type.PROPERTY)
public List<UserProfile> getUserProfiles() {
    return super.getUserProfiles();
}
}

更新: 我发现 Spring 只抱怨 userName 字段。当我将它添加到派生类时,应用程序不会崩溃。出于某种原因,它只适用于其他领域。现在我其实比以前更糊涂了。

【问题讨论】:

    标签: java spring-boot jpa


    【解决方案1】:

    你可能需要在你的超类UserImpl上使用@MappedSuperclass注解

    请参阅文档https://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html

    【讨论】:

    • 不,这没有帮助。这一定是一个非常奇怪的问题,请参阅我的更新。
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多