У меня есть приложение Spring Boot, связанное с PostgreSQL, у меня проблема с двумя моими классами. User.Class и Vehicle.Class. Когда я пытаюсь сделать POST-запрос от почтальона, чтобы создать новое транспортное средство, я не могу сгенерировать FK в таблице транспортных средств в базе данных. Я думаю, что, возможно, у меня есть проблема с объявлением отношений OneToMany в этих двух сущностях.
User.Class
@Entity
@Table(name = "users", schema = "vehicleproject")
public class User {
@Id
@Column(name = "user_id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "email")
private String email;
@Column(name = "password")
private String password;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "address")
private String address;
@Column(name = "afm")
private int afm;
@Column(name = "role_id")
private UserType type;
@OneToMany(mappedBy = "user", targetEntity = Vehicle.class)
private List<Vehicle> vehicles;
public User(){}
public User(long id, String email, String password, String firstName, String lastName, String address, int afm, UserType type, List<Vehicle> vehicles) {
this.id = id;
this.email = email;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
this.afm = afm;
this.type = type;
this.vehicles = vehicles;
}
public User(long id, String email, String password, String firstName, String lastName, String address, int afm, UserType type) {
this.id = id;
this.email = email;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
this.afm = afm;
this.type = type;
this.vehicles = new ArrayList<>();
}
public User(String email, String password, String firstName, String lastName, String address, int afm, UserType type) {
this.email = email;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.address = address;
this.afm = afm;
this.type = type;
this.vehicles = new ArrayList<>();
}
public List<Vehicle> getVehicles() {
return vehicles;
}
public void setVehicles(List<Vehicle> vehicles) {
this.vehicles = vehicles;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getAfm() {
return afm;
}
public void setAfm(int afm) {
this.afm = afm;
}
public UserType getType() {
return type;
}
public void setType(UserType type) {
this.type = type;
}
public void addVehicleToList(Vehicle vehicle){
this.vehicles.add(vehicle);
}
public void removeVehicleFromUserList(Vehicle vehicle){
this.vehicles.remove(vehicle);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", email='" + email + '\'' +
", password='" + password + '\'' +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", address='" + address + '\'' +
", afm=" + afm +
", type='" + type + '\'' +
", vehicles=" + vehicles +
'}';
}
}
Vehicle.Class
@Entity
@Table(name = "vehicles", schema = "vehicleproject")
public class Vehicle {
@Id
@Column(name = "vehicle_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "brand")
private String brand;
@Column(name = "model")
private String model;
@Column(name = "creation_date")
private LocalDate creationDate;
@Column(name = "color")
private String color;
@JsonIgnore
@ManyToOne(optional = false)
@JoinColumn(name = "user_id", referencedColumnName = "user_id")
private User user;
@Column(name = "plate_number")
private String plateNumber;
public Vehicle(){
}
public Vehicle(long id, String brand, String model, LocalDate creationDate, String color, User user, String plateNumber) {
this.id = id;
this.brand = brand;
this.model = model;
this.creationDate = creationDate;
this.color = color;
this.user = user;
this.plateNumber = plateNumber;
}
public Vehicle(String brand, String model, LocalDate creationDate, String color, User user, String plateNumber) {
this.brand = brand;
this.model = model;
this.creationDate = creationDate;
this.color = color;
this.user = user;
this.plateNumber = plateNumber;
}
public Vehicle(long id, String brand, String model, LocalDate creationDate, String color, String plateNumber) {
this.id = id;
this.brand = brand;
this.model = model;
this.creationDate = creationDate;
this.color = color;
this.plateNumber = plateNumber;
}
public String getPlateNumber() {
return plateNumber;
}
public void setPlateNumber(String plateNumber) {
this.plateNumber = plateNumber;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public LocalDate getCreationDate() {
return creationDate;
}
public void setCreationDate(LocalDate creationDate) {
this.creationDate = creationDate;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@JsonIgnore
public User getUser() {
return user;
}
@JsonProperty
public void setUser(User user) {
this.user = user;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Vehicle vehicle = (Vehicle) o;
return id == vehicle.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return "Vehicle{" +
"id=" + id +
", brand='" + brand + '\'' +
", model='" + model + '\'' +
", creationDate=" + creationDate +
", color='" + color + '\'' +
", user=" + user +
", plateNumber='" + plateNumber + '\'' +
'}';
}
}
SQL TABLES
CREATE TABLE vehicleproject.vehicles (
vehicle_id serial NOT NULL,
brand varchar(255) NOT NULL,
model varchar(255) NOT NULL,
creation_date date NULL,
color varchar(255) NOT NULL,
plate_number varchar(255) NOT NULL,
user_id int8 NULL,
CONSTRAINT vehicle_pkey PRIMARY KEY (vehicle_id),
CONSTRAINT vehicle_plate_number_key UNIQUE (plate_number),
CONSTRAINT vehicle_user_id_fkey FOREIGN KEY (user_id) REFERENCES
vehicleproject.users(user_id)
);
CREATE TABLE vehicleproject.users (
id serial NOT NULL,
email varchar(255) NULL,
"password" varchar(255) NULL,
first_name varchar(255) NOT NULL,
last_name varchar(255) NOT NULL,
address varchar(255) NOT NULL,
afm int8 NULL,
role_id int8 NOT NULL,
CONSTRAINT user_email_key UNIQUE (email),
CONSTRAINT user_pkey PRIMARY KEY (user_id),
CONSTRAINT user_role_code_fkey FOREIGN KEY (role_id) REFERENCES
vehicleproject.roles(role_code) ON DELETE CASCADE
);
Я пытаюсь выполнить ЗАПРОС ПОСТА ОТ ПОСТМЕНА, например:
{
"brand": "OPEL",
"model": "KALIBRA",
"creationDate": "2015-05-05",
"color": "WHITE",
"plateNumber": "AAA2222",
"user_id":"2"
}
Но в ТАБЛИЦЕ Транспортных средств я беру "NULL" в столбце "user_id" и в IntelliJ я беру это сообщение:
2019-06-17 19:43:25.907 INFO 12848 --- [ main]
org.hibernate.Version : HHH000412: Hibernate Core
{5.3.9.Final}
2019-06-17 19:43:25.912 INFO 12848 --- [ main]
org.hibernate.cfg.Environment : HHH000206: hibernate.properties
not found
2019-06-17 19:43:26.104 INFO 12848 --- [ main]
o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons
Annotations {5.0.4.Final}
2019-06-17 19:43:26.335 INFO 12848 --- [ main]
org.hibernate.dialect.Dialect : HHH000400: Using dialect:
org.hibernate.dialect.PostgreSQL95Dialect
2019-06-17 19:43:26.637 INFO 12848 --- [ main]
o.h.e.j.e.i.LobCreatorBuilderImpl : HHH000421: Disabling contextual
LOB creation as hibernate.jdbc.lob.non_contextual_creation is true
2019-06-17 19:43:26.645 INFO 12848 --- [ main]
org.hibernate.type.BasicTypeRegistry : HHH000270: Type registration
[java.util.UUID] overrides previous :
org.hibernate.type.UUIDBinaryType@424f02b8
2019-06-17 19:43:27.513 INFO 12848 --- [ main]
j.LocalContainerEntityManagerFactoryBean : Initialized JPA
EntityManagerFactory for persistence unit 'default'
2019-06-17 19:43:28.181 INFO 12848 --- [ main]
o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService
'applicationTaskExecutor'
2019-06-17 19:43:28.227 WARN 12848 --- [ main]
aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is
enabled by default. Therefore, database queries may be performed during
view rendering. Explicitly configure spring.jpa.open-in-view to disable
this warning
2019-06-17 19:43:28.541 INFO 12848 --- [ main]
o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080
(http) with context path ''
2019-06-17 19:43:28.547 INFO 12848 --- [ main]
c.a.v.VehicleRepairShopApplication : Started
VehicleRepairShopApplication in 6.402 seconds (JVM running for 7.474)
2019-06-17 19:44:12.403 INFO 12848 --- [nio-8080-exec-1] o.a.c.c.C.
[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet '
dispatcherServlet'
2019-06-17 19:44:12.403 INFO 12848 --- [nio-8080-exec-1]
o.s.web.servlet.DispatcherServlet : Initializing Servlet
'dispatcherServlet'
2019-06-17 19:44:12.417 INFO 12848 --- [nio-8080-exec-1]
o.s.web.servlet.DispatcherServlet : Completed initialization in 13
ms
2019-06-17 19:44:12.642 DEBUG 12848 --- [nio-8080-exec-1]
org.hibernate.SQL :
insert
into
vehicleproject.vehicles
(brand, color, creation_date, model, plate_number, user_id)
values
(?, ?, ?, ?, ?, ?)
2019-06-17 19:44:12.646 TRACE 12848 --- [nio-8080-exec-1]
o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as
[VARCHAR] - [OPEL]
2019-06-17 19:44:12.646 TRACE 12848 --- [nio-8080-exec-1]
o.h.type.descriptor.sql.BasicBinder : binding parameter [2] as
[VARCHAR] - [WHITE]
2019-06-17 19:44:12.650 TRACE 12848 --- [nio-8080-exec-1]
o.h.type.descriptor.sql.BasicBinder : binding parameter [3] as [DATE]
- [2015-05-05]
2019-06-17 19:44:12.650 TRACE 12848 --- [nio-8080-exec-1]
o.h.type.descriptor.sql.BasicBinder : binding parameter [4] as
[VARCHAR] - [KALIBRA]
2019-06-17 19:44:12.650 TRACE 12848 --- [nio-8080-exec-1]
o.h.type.descriptor.sql.BasicBinder : binding parameter [5] as
[VARCHAR] - [AAA2222]
2019-06-17 19:44:12.650 TRACE 12848 --- [nio-8080-exec-1]
o.h.type.descriptor.sql.BasicBinder : binding parameter [6] as
[BIGINT] - [null]
Я вижу проблему в последней строке, но не могу ее исправить.
Заранее спасибо!