У меня есть веб-приложение, в котором есть база данных, которая имеет объект Customer
и объект Car
. У меня есть отношения ManyToMany
между Car
и Customer
(или, по крайней мере, я намерен), и это в моем классе BookedCar
.
BookedCar
:@Entity
@Table(name = "booked_cars")
data class BookedCar(@Column(name = "car_id") var carId: Int = 0,
@Column(name = "customer_id") var customerId: Int = 0,
@Column var startDate: Date = Date(),
@Column var endDate: Date = Date()) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = 0
}
Car
:@Entity
@Table(name = "cars")
data class Car(@Column var name: String = "",
@Column var price: Int = 0,
@Column(length = 1000) var imgURL: String = "") {
fun getPriceForPeriodPerDay(days: Int) = when (days) {
in 0..3 -> this.price
in 3..8 -> this.price - 7
in 8..15 -> this.price - 15
in 15..Int.MAX_VALUE -> this.price - 20
else -> this.price
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = 0
@ManyToMany(cascade = [CascadeType.ALL])
@JoinTable(name = "booked_cars",
joinColumns = [(JoinColumn(name = "car_id", referencedColumnName = "id"))],
inverseJoinColumns = [JoinColumn(name = "customer_id", referencedColumnName = "id")])
lateinit var customers: Set<Customer>
}
Customer
:@Entity
@Table(name = "customers")
data class Customer(@Column var phoneNumber: String = "",
@Column var name: String = "") {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Int = 0
@ManyToMany(mappedBy = "customers")
lateinit var bookedCars: Set<Car>
}
В одном из моих контроллеров у меня есть функция с некоторым отображением и кодом:
...
val customer = this.customerRepository.findOneByPhoneNumber(phoneNumber)
?: Customer(phoneNumber, "")
val car = this.carRepository.findOne(id)
val bookedCar = BookedCar(car.id,customer.id, startDate, endDate)
this.requestedCarRepository.saveAndFlush(bookedCar)
...
Проблема возникает именно на этой линии
this.requestedCarRepository.saveAndFlush(bookedCar)
и ошибка
java.sql.SQLException: Field 'id' doesn't have a default value
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) ~[mysql-connector-java-5.1.45.jar:5.1.45]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973) ~[mysql-connector-java-5.1.45.jar:5.1.45]
...
at com.rentautosofia.rentacar.controller.FrontCarController.orderProcess(FrontCarController.kt:113) ~[classes/:na]
...
Я не думаю, что правильно написал JoinColumn
. В целом любая помощь будет высоко оценена.
Я попытался воссоздать базы данных.
spring.datasource.url = jdbc:mysql://localhost:3306/rentacar?...&createDatabaseIfNotExist=true
Jpa DDL автоинкремент:
# Hibernate ddl auto (create, create-drop, update): with "update" the database
# schema will be automatically updated accordingly to java entities found in
# the project
# Using "create" will delete and recreate the tables every time the project is started
spring.jpa.hibernate.ddl-auto = update
Вы не можете смешивать таблицу объединений с сущностью
Вы определили BookedCar
как сущность... вам это действительно нужно, или вам просто нужна таблица соединений, чтобы многие из многих присоединялись между клиентом и автомобилем... если вам нужно добавить больше колонок в забронированный автомобиль (не обязательный ID, я имею в виду столбец, который содержит некоторый бизнес), тогда ok делает его сущностью, иначе просто сделайте его столбцом объединения
Если вы решили сделать это сущностью, то вам понадобится от одного до многих отношений от каждого клиента и автомобиля до забронированного автомобиля и от нескольких до одного с забронированного автомобиля до каждого из них.... вместо этого отношения ManyToMany, которое вы используете в автомобиле и клиенте