Таблица в БД заполняется не полностью. Колонка с ID для обеспечения связи между таблицами пуста
У меня есть два класса Customer and User. Класс Customer соединен с классом User через связи @OneToOne, соответственно, тоже самое касается и таблиц customer и pg_user. Все поля User'a так же принадлежат Customer'у. При создании нового customer через post-метод у меня в базе в таблице pg_user создает запись со всеми заполненными полями, а в таблице customer заполняется только id и wallet. Колонка с user_id которая обеспечивает связь пустая, не заполняется. Как можно исправить?
Использую Spring-MVC + Hibernate + Jpa + PostgreSQL.
Это мой первый проект на Spring.
User:
package com.tinychiefdelights.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
@ApiModel
@Data
@Entity
@Table(name = "pg_user", schema = "public")
public class User {
public User() { // Пустой конструктор для Hibernate
}
public User(String name, String lastName, String role,
String login, String password) { // Базовый конструктор
this.name = name;
this.lastName = lastName;
this.role = role;
this.login = login;
this.password = password;
}
// Поля
private @Id
@GeneratedValue
Long id;
@Column(name = "login")
private String login;
@Column(name = "password")
private String password;
@Column(name = "role")
private String role;
@Column(name = "name")
private String name;
@Column(name = "last_name")
private String lastName;
}
Customer:
package com.tinychiefdelights.model;
import com.fasterxml.jackson.annotation.*;
import com.tinychiefdelights.repository.CustomerRepository;
import lombok.Data;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
import javax.persistence.*;
import java.util.List;
@Data
@Entity
@Table(name = "customer", schema = "public")
public class Customer {
public Customer() { // Пустой конструктор для Hibernate
}
// Поля
// name, lastName, login, password берем от класса User через связи;
private @Id
@GeneratedValue
Long id;
@Column(name = "wallet")
private double wallet;
//Relationships
//
@OneToOne
@JoinColumn(name = "user_id", referencedColumnName = "id") // Join without Customer in User class
@NotFound(action = NotFoundAction.IGNORE)
private User user;
//Лист заказов
@OneToMany(mappedBy = "customer", cascade = CascadeType.ALL)
@JsonIgnore // Таким образом я предотвратил рекурсию
private List<Order> orderList;
}
Customer Service:
package com.tinychiefdelights.service;
import com.tinychiefdelights.model.Customer;
import com.tinychiefdelights.model.User;
import com.tinychiefdelights.repository.CustomerRepository;
import com.tinychiefdelights.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CustomerService extends UserService {
private CustomerRepository customerRepository;
private UserRepository userRepository;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Autowired
public void setCustomerRepository(CustomerRepository customerRepository) {
this.customerRepository = customerRepository;
}
// Методы
//
public Customer addCustomer(User newUser, Customer newCustomer){
userRepository.save(newUser);
return customerRepository.save(newCustomer);
}
Customer Controller:
package com.tinychiefdelights.controller;
import com.tinychiefdelights.exceptions.NotFoundException;
import com.tinychiefdelights.model.Customer;
import com.tinychiefdelights.model.User;
import com.tinychiefdelights.repository.CustomerRepository;
import com.tinychiefdelights.service.CustomerService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Api(value = "Работа с Заказчиком", tags = {"Заказчик"})
@RestController
public class CustomerController {
//Constructor
//
@Autowired
public CustomerController(CustomerRepository customerRepository, CustomerService customerService) {
this.customerRepository = customerRepository;
this.customerService = customerService;
}
// Fields
//Injects into constructor
//
private final CustomerRepository customerRepository;
private CustomerService customerService;
// Aggregate Root
@GetMapping("/customers")
List<Customer> all(){
return customerRepository.findByUserRole("customer");
}
@PostMapping("/customers")
Customer addCustomer(User newUser, @RequestBody Customer newCustomer){
return customerService.addCustomer(newUser, newCustomer);
}
Ответы (1 шт):
Когда выполняется
customerRepository.save(newCustomer)
у него нету ссылки на userId
После сохранение юзера надо SELECT user и передать его в конструктор customera


