首页 > 解决方案 > 引用另一个复合键的 JPA 复合键

问题描述

我有三个表,其中两个具有复合主键,其中一个复合键引用另一个:

VEHICLE
| MAKE | MODEL | NOTES |
Primary Key = Make + Model

VEHICLE_LABEL
| VEH_MAKE | VEH_MODEL | LAB_ID | ORDER |
Primary Key = VEH_MAKE + VEH_MODEL + LAB_ID

LABEL
| ID | NAME | NOTES |
Primary Key = ID

由于连接表上的额外列,我已将其创建VehicleLabel为自己的Entity

车辆:

@Entity
@Table(name = "VEHICLE")
class Vehicle @PersistenceConstructor constructor(
    @EmbeddedId
    val key: ID,

    @Column(name = "NOTES")
    val notes: String
) {
    @Embeddable
    class ID(
        @Column(name = "MAKE")
        val make: String,

        @Column(name = "MODEL")
        val model: String
    ) : Serializable
}

车辆标签:

@Entity
@Table(name = "VEHICLE_LABEL")
class VehicleLabel @PersistenceConstructor constructor(
    @EmbeddedId
    val key: ID,

    @Column(name = "ORDER")
    val order: Int
) {
    @Embeddable
    class ID @PersistenceConstructor constructor(
        @ManyToOne
        @JoinColumns(
            JoinColumn(name = "VEH_MAKE", referencedColumnName = "MAKE"),
            JoinColumn(name = "VEH_MODEL", referencedColumnName = "MODEL")
        )
        val vehicle: Vehicle,

        @ManyToOne
        @JoinColumn(name = "LAB_ID")
        val label: Label
    ) : Serializable
}

标签:

@Entity
@Table(name = "LABEL")
class Label(
    @Id
    @Column(name = "ID")
    val id: String,

    @Column(name = "NAME")
    val name: String

    @Column(name = "NOTES")
    val notes: String
)

当我运行上述内容时,虽然我得到了

InvalidDataAccessApiUsageException: Provided id of the wrong type for class repository.Vehicle. Expected: class repository.Vehicle$ID, got class java.lang.String

我尝试交换VehicleLabel.ID,而不是包含完整Vehicle的内容,Vehicle.ID但我得到了同样的错误。理想情况下,我宁愿不这样做。

注意:我试图避免向VEHICLE表中添加 ID,因为已经通过MAKE+确保了唯一性MODEL

我究竟做错了什么?

标签: hibernatekotlinspring-data-jpaspring-data

解决方案


原来错误来自正在调用的测试类entityManager.find(Vehicle::class, "model")

它是车辆 ID 只是model字段时的遗留物。


推荐阅读