hibernate - 引用另一个复合键的 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
我究竟做错了什么?
解决方案
原来错误来自正在调用的测试类entityManager.find(Vehicle::class, "model")
。
它是车辆 ID 只是model
字段时的遗留物。
推荐阅读
- android - 我如何才能收到 2 项活动的意向?
- kubernetes - 如何在 Kubernetes 中查看 API 访问日志?
- mysql - 如何优化 SQL 查询?
- c# - 触发 ComboBox SelectedValue 不起作用
- flutter - 'package:flutter/src/painting/_network_image_io.dart':断言失败:第 22 行 pos 14:'url != null':不正确
- sql-server - 如果在 SQL Server 中使用多个插入语句,则为 else
- java - 从 CLI 运行自定义 mojo 时,Maven 无法识别参数
- scikit-learn - ValueError:至少需要一个数组或数据类型 HistGradientBoostingRegressor
- mysql - EAV、多左连接查询优化
- javascript - 存根和假货有什么区别?