Spring Boot + JPA: «Невозможно найти атрибут с заданным именем» в производном классе - PullRequest
0 голосов
/ 23 июня 2019

Я работаю над приложением, которое использует Spring Boot + JPA для сохранения некоторых объектов.Однако эти объекты (и, конечно, конфигурация Spring) являются единственными в приложении, которые зависят от Spring / JPA.Вот почему мы хотели разделить приложение на два компонента.Основное приложение, которое должно быть независимым от Spring и любых связанных с JPA вещей и Spring-приложения.Для этой цели мы создали интерфейс и базовую реализацию сущности в базовом приложении и производную реализацию в приложении Spring, которая переопределяет только получатели и использует доступ к свойству.Но теперь Spring жалуется, что поля отсутствуют.

Вот класс в основном приложении, в основном просто набор методов получения и установки:

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.Когда я добавляю его в производный класс, приложение не падает.По некоторым причинам это просто работает с другими полями.Теперь я на самом деле запутался больше, чем раньше.

1 Ответ

0 голосов
/ 23 июня 2019

Возможно, вам потребуется использовать аннотацию @MappedSuperclass в вашем суперклассе UserImpl

См. Документы https://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...