JPA:一个带有主键的表和另一个带有主键和外键的表
Posted
技术标签:
【中文标题】JPA:一个带有主键的表和另一个带有主键和外键的表【英文标题】:JPA : one table with primary key and another table with primary and foreign key 【发布时间】:2014-12-05 13:17:17 【问题描述】:我通过阅读一本书开始学习 JPA,他们给出了一个单向映射,如下所示:
桌子车辆
(vehicleId, brand, model, dev_year, extraId)
vehicleId是PK, extraId 是 FK
表travel_extra
(id, allowSmoke, allowFood, allowDrinks, airConditioner)
id是PK
然后是java对象:
public class Vehicle
@Id
private long vehicleId;
private String brand;
private String model;
@OneToOne
@JoinColumn(name = "vehicleId")
private TravelExtra travelExtra;
public class TravelExtra
@Id
private id;
private boolean allowSmoke;
private boolean allowFood;
private boolean allowDrinks;
private boolean airConditioner;
当我坚持并提交交易时,它就像一个魅力。
但是!就我而言,我不希望 vehicle 表有外键,但我希望外键位于 travel_extra 表中并链接到车辆的主键桌子。但是当我这样做时,代码不起作用,无论我尝试做什么,我都无法让它工作。
如果有人曾经经历过这样的事情,我会很乐意提供一些帮助和如何使其发挥作用的示例。
提前致谢。
【问题讨论】:
JPA: Foreign key that is also a primary key mapping 的可能重复项 您应该编辑已经有 2 个有效建议的第一个问题。 建议不是很准确,所以我决定问这个问题有点不同 我稍后会尝试将问题合并为一个...... 我建议您的问题不太准确。您现在需要 travel_extra 中的 FK。一分钟前它是一个共享主键。 【参考方案1】:尝试使用@JoinColumn(name = "vehicleId", insertable = false, updateable = false)
,并在TravelExtra
表中创建vehicleID
列。 insertable = false, updateable = false
应该指示 ORM 在目标表中查找列。
编辑
我的参考是this,它指出:
在 JPA 中,JoinColumn 定义了 insertable 和 updatable 属性,这些属性可用于指示 JPA 提供者外键实际上在目标对象的表中
如果不起作用(因为规范不保证),您可以使关系双向(只需在TravelExtra
实体中添加映射,无需进一步更改数据库)
public class Vehicle
...
@OneToOne(mappedBy = "vehicle", cascade = CascadeType.ALL)
private TravelExtra travelExtra;
...
public class TravelExtra
...
@OneToOne
@JoinColumn(name = "vehicleId")
private Vehicle vehicle;
...
【讨论】:
这是我得到的:javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException Internal异常:java.sql.SQLException:字段'vehicleId'没有默认值错误代码:1364调用:插入到travel_extra(primaryKeyId,airConditioner,allowDrinks,allowFood,allowSmoke,行李)值(?,?,?,? , ?, ?) bind => [6 个参数绑定] 查询:InsertObjectQuery(Core.TravelExtra[ primaryKeyId=1 ]) 我不希望 TravelExtra 引用 Vehicle【参考方案2】:您不需要参考 VehicleExtra 信息 (id) 来扩充您的 Vehicle 类,因为 Vehicle 完全独立于 VehicleExtra,只有 VehicleExtra 需要了解 Vehicle。
answer here
【讨论】:
以上是关于JPA:一个带有主键的表和另一个带有主键和外键的表的主要内容,如果未能解决你的问题,请参考以下文章