поле весенней загрузки всегда пусто даже после публикации - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть LoginCredential класс:

public class LoginCredential {
    @Id @GeneratedValue Long userID;
    String eMail;
    String passwordHash;
    @OneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY)
    User user;
    LoginCredential(){}
    public LoginCredential(String eMail, String passwordHash, User user) 
    {
        this.eMail = eMail;
        this.passwordHash = passwordHash;
        this.user = user;
    }
}

Тогда у меня есть User класс:

public class User {
    @Id @GeneratedValue Long userID;
    @OneToOne(fetch = FetchType.LAZY,targetEntity = LoginCredential.class)
    @JoinColumn(name = "userID",referencedColumnName = "userID")
    @JsonIgnore
    private LoginCredential loginCredential;
    public User(){}
    public User(String eMail)
    {
          this.eMail=eMail;
    }
    public User(String eMail, LoginCredential loginCredential) {
        this.eMail = eMail;
        this.loginCredential = loginCredential;
    }
}

В моей системе, прежде всего, экземпляр LoginCredentialсоздается.

Но для меня проблема в том, что после создания этого экземпляра поле user остается null.

Как решить эту проблему?

Поскольку они сопоставлены один на один , есть ли другие способы сделать это?

Я пробовал это: {"email":"test@gmail.com","passwordHash":"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3","user":{"userID":801,"email":"test@gmail.com"}}

метод, который я использую в переднем конце, в моем react.js приложении:

createUserAndCredential = () => {

  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'http://localhost:8080/login/');
  xhr.setRequestHeader("Content-Type", "application/json");
  xhr.send(JSON.stringify({
    email: this.state.email,
    passwordHash: this.state.passwordHash
  }));
  let that = this;
  xhr.onreadystatechange = function() {
    if (this.readyState === 4 && this.status === 200) {
      console.log(this.responseText);
      /*
      console.log(this.responseText);
      console.log(that.state.newLoginCredential);
      */

      that.state.newLoginCredential = this.responseText.toString();


      var xhr1 = new XMLHttpRequest();
      xhr1.open('POST', 'http://localhost:8080/user/');
      xhr1.setRequestHeader("Content-Type", "application/json");
      console.log(that.state.newLoginCredential);

      let user = JSON.stringify({
        email: that.state.email,
        loginCredential: JSON.parse(that.state.newLoginCredential)
      });

      //console.log(loginCredential);

      xhr1.send(user);

    } else if (this.readyState !== 4 && this.status !== 200) {
      console.log(this.status);
    }
  };
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

Что дает мне это предупреждение:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parseошибка: невозможно создать экземпляр com.mua.cse616.Model.LoginCredential (хотя существует хотя бы один создатель): нет конструктора аргумента строки / фабричного метода для десериализации из значения строки ('{"email": "t7@gmail.com", "passwordHash":"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3"} ');Вложенное исключение - com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно создать экземпляр com.mua.cse616.Model.LoginCredential (хотя существует хотя бы один создатель): нет конструктора аргумента String / метода фабрики для десериализации из значения String ('{"email": "t7@gmail.com", "passwordHash": "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3"} ') в [Source: (PushbackInputStream);строка: 1, столбец: 43] (через цепочку ссылок: com.mua.cse616.Model.User ["loginCredential"])]

1 Ответ

2 голосов
/ 23 сентября 2019

Поскольку отображение находится на стороне User (там находится mappedBy), вам необходимо сохранить его, чтобы увидеть изменения, заполненные до LoginCredential.Но вы можете определить изменения между родительским и каскадным потомками:

@OneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY, cascade = CascadeType.ALL)

Или, если вы не хотите каскадировать все (например, удаление):

@OneToOne(mappedBy = "loginCredential", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...