【问题标题】:Hibernate: Field 'id' doesn't have a default value休眠:字段“id”没有默认值
【发布时间】:2018-07-31 07:55:42
【问题描述】:

我有一个网络应用程序,它有一个数据库 Customer 实体和 Car 实体。 我在CarCustomer 之间有ManyToMany 关系(或者至少我打算这样做),它在我的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]
...

我认为我写的 JoinColumns 不正确。总的来说,任何帮助将不胜感激。

注意:

我尝试重新创建数据库。

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

【问题讨论】:

  • mysql中每个id列的数据类型是什么?是自增吗?
  • 这是身份。它应该自动递增。我认为至少。
  • 身份?你能展示你的 DDL 吗?
  • 用户没有让JPA提供者创建表,所以它不是自动增量?
  • 在问题末尾添加了有关 DDL 的详细信息。

标签: mysql hibernate jpa spring-boot kotlin


【解决方案1】:

您不能将连接表与实体混合使用

您将BookedCar 定义为一个实体...您真的需要这个还是只需要一个连接表来在客户和汽车之间进行多对多连接...如果您需要在预订汽车(不是强制性 ID,我的意思是包含一些业务的列)然后确定将其设为实体,否则只需将其设为连接列

如果您决定将其设为实体,那么您将需要从 customer 和 car 到booked_car 的每个人的一对多关系,以及从booked_car 到他们每个人的多对一关系......而不是这个 ManyToMany 关系您在汽车和客户中使用

【讨论】:

  • 哇,我好笨!
  • 其实我所做的我什至不需要关系!
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 2015-07-19
  • 2013-07-26
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多