Hibernate: поле 'id' не имеет значения по умолчанию

0

У меня есть веб-приложение, в котором есть база данных, которая имеет объект 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

Изменить 1:

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
  • 0
    Каков тип данных каждого столбца идентификатора в MySQL? это автоинкремент?
  • 0
    Это личность. Он должен сам себя увеличивать. На keast я думаю.
Показать ещё 3 комментария
Теги:
kotlin
spring-boot
hibernate
jpa

1 ответ

0
Лучший ответ

Вы не можете смешивать таблицу объединений с сущностью

Вы определили BookedCar как сущность... вам это действительно нужно, или вам просто нужна таблица соединений, чтобы многие из многих присоединялись между клиентом и автомобилем... если вам нужно добавить больше колонок в забронированный автомобиль (не обязательный ID, я имею в виду столбец, который содержит некоторый бизнес), тогда ok делает его сущностью, иначе просто сделайте его столбцом объединения

Если вы решили сделать это сущностью, то вам понадобится от одного до многих отношений от каждого клиента и автомобиля до забронированного автомобиля и от нескольких до одного с забронированного автомобиля до каждого из них.... вместо этого отношения ManyToMany, которое вы используете в автомобиле и клиенте

  • 0
    Вау, я такой тупой!
  • 0
    На самом деле для того, что я делал, мне даже не нужны были отношения!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню