JPA:一个包含主键的表和另一个包含主键和外键的表

时间:2014-12-05 13:17:17

标签: java jpa orm

我开始通过阅读一本书来研究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; 

}

当我坚持提交时,它会像魅力一样运作。

然而!对于我的情况我不希望车辆表有外键但我希望外键位于 travel_extra 表中并链接到车辆的主键表。但是,当我这样做时,代码不起作用,无论我尝试做什么,我都无法使其工作。

如果有人经历过这样的事情,我会很高兴能得到一些帮助以及如何让它成功的例子。

提前致谢。

2 个答案:

答案 0 :(得分:1)

尝试使用@JoinColumn(name = "vehicleId", insertable = false, updateable = false),并在vehicleID表格中创建TravelExtra列。 insertable = false, updateable = false应指示ORM在目标表中查找列。

修改

我的引用是this,其中声明:

  

在JPA中,JoinColumn定义了可插入可更新属性,这些属性可用于指示JPA提供程序外键实际位于目标对象的表中

如果它不起作用(因为规范不能保证),你可以建立双向关系(只需在TravelExtra实体中添加一个映射,不需要进一步的数据库更改)

public class Vehicle {
    ...
    @OneToOne(mappedBy = "vehicle", cascade = CascadeType.ALL)
    private TravelExtra travelExtra;
    ...
}

public class TravelExtra {
    ...
    @OneToOne
    @JoinColumn(name = "vehicleId")
    private Vehicle vehicle;
    ...
}

答案 1 :(得分:0)

您不需要参考VehicleExtra信息(id)来提高您的Vehicle类,因为Vehicle完全独立于VehicleExtra,所以只有VehicleExtra才需要了解Vehicle。

answer here