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 定义了 insertableupdatable 属性,这些属性可用于指示 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:一个带有主键的表和另一个带有主键和外键的表的主要内容,如果未能解决你的问题,请参考以下文章

数据库中的表怎样设置外键又怎样才能看出已经是外键了

navicat内的主键和外键

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?

具有主键和外键的事实表

SQL怎么在有外键的主键表中插数据