Метод POST для отношения "один к одному" - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь сделать POST-запрос для сохранения User с UserProfile, но получаю сообщение об ошибке.

@Entity
@Table(name = "user")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String login;

    @OneToOne(fetch = FetchType.LAZY, cascade =  CascadeType.ALL, mappedBy = "user")
    private UserProfile userProfile;
}

@Entity
@Table(name = "user_profile")
public class UserProfile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    @JsonIgnore
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}

Есть ли разница между этими двумя методами POST ?

@RestController
@RequestMapping("/api/user")
public class UserController {
    @PostMapping
    public User save(@RequestBody User user) {
        return userRepository.save(user);
    }

    @PostMapping("/anotherSave")
    public User anotherSave() {
        User user = new User();
        user.setLogin("Login");

        UserProfile userProfile = new UserProfile();
        userProfile.setName("Name");

        user.setUserProfile(userProfile);
        userProfile.setUser(user);

        return userRepository.save(user);
    }
}

Второй работает отлично без ошибок. Первый выдает исключение Column 'user_id' cannot be null. Ниже показано, как я использую первый метод POST в HTTP-запросе:

POST http://localhost:8080/api/user
Content-Type: application/json

{
  "login": "a",
  "userProfile": {
    "name": "A"
  }
}

Мой запрос неверен или неправильно построена связь?

1 Ответ

1 голос
/ 12 июля 2020

У вас UserProfile.user проигнорирован в теле запроса JSON, поэтому я думаю, вы могли бы добавить что-то вроде

user.getUserProfile().setUser(user);

в свой первый метод перед сохранением в репозиторий.

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