【问题标题】:getting deploy error during the creation of relationship onetoone beetween entities在创建实体之间的一对一关系期间出现部署错误
【发布时间】:2014-08-04 01:14:05
【问题描述】:

我正在尝试创建两个实体,但出现以下错误

Exception Description: Entity class [class it.volaconoi.entity.Airport] must use a @JoinColumn instead of @Column to map its relationship attribute [city].

这些是实体。我想要将city_source 连接到机场实体中的city,与city_dest 相同。不幸的是我得到了那个错误。毫无疑问,错误是由于我以错误的方式创建了关系。

@Entity
@Table(name = "ROUTE")
public class Route implements Serializable
{
    @Id
    @Column(name = "ID_ROUTE")
    private String id_route;

    @Column(name = "AIRLANE", nullable = false)
    private String airlane;

    @Column(name = "AIRCRAFT_ID", nullable = false)
    private String aircraft_id;

    @Column(name = "CITY_SOURCE", nullable = false)
    @OneToOne(mappedBy = "city", optional = false)
    private String airport_city_source;

    @Column(name = "CITY_DEST", nullable = false)
    @OneToOne(mappedBy = "city", optional = false)
    private String airport_city_dest;

    @Column(name = "DEPARTURE_DATE", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date departure_date;

    @Column(name = "ARRIVAL_DATE", nullable = false)
    @Temporal(TemporalType.DATE)
    private Date arrival_date;

    @Column(name = "TRAVEL_CLASS", nullable = false)
    private String travel_class;

    @Column(name = "SEATS", nullable = false)
    private int seats;

    @Column(name = "PRICE", nullable = false)
    private float price;

...

机场

@Entity
@Table(name = "AIRPORT")
public class Airport implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "AIRPORT_ID")
    private Integer id;
    @Column(name = "NAME", nullable = false)
    private String name;
    @Column(name = "CITY")
    @OneToOne
    private String city;
    @Column(name = "COUNTRY")
    private String country;
    @Column(name = "IATA_FAA")
    private String iata_faa_code;
    @Column(name = "ICAO")
    private String icao_code;
    @Column(name = "LATITUDE")
    private String latitude;
    @Column(name = "LONGITUDE")
    private String longitude;
    @Column(name = "ALTITUDE")
    private String altitude;
    @Column(name = "TIMEZONE")
    private String timezone;
    @Column(name = "DST")
    private String dst;
...

【问题讨论】:

    标签: jakarta-ee jpa entity


    【解决方案1】:

    您的错误消息非常清楚地告诉您出了什么问题:当您为关系建模时,您必须指定连接列。有关简短示例,请参阅 Javadoc,或阅读有关整个主题的 Java EE tutorial

    还有一个建议:自 Java EE 5 以来的想法是使用约定优于配置,因此您不必指定默认值(例如名称)。

    【讨论】:

    • 我已经尝试放置 JoinColumn 但没有任何成功。我还没有清楚地知道将 JoinColumn 放在哪里。
    【解决方案2】:

    错误表明,您正在使用 JPA 提供者认为应该是关系映射的列注释 - 出于某种原因,它认为 Airport City 字符串是关系而不是基本映射。关系映射需要连接列来指定外键字段以及它们连接到的目标表中的字段,而列用于基本映射。

    机场实体似乎正确映射了这些类型 - 它在看似基本的映射上显示了一个 @Column 注释,问题肯定出在其他地方。

    另一方面,Route 的 airport_city_source 和 airport_city_dest 不正确,因为它们声明它们应该映射到列,但实际上是与另一个实体的 OneToOne 关系,其中该实体的城市映射定义了此操作所需的外键连接列映射。由于错误是抱怨城市映射不正确,这很可能是来源。删除 @OneToOne 将使它们成为与这些属性的 String 类型匹配的基本映射。

    如果您希望它们映射到实体,则需要将类型更改为实体类型(也许是城市?)并删除 mappedby 或添加 joincolumn。

    您不能像您尝试的那样将字符串链接在一起。相反,也许 Route 应该知道机场起点和终点,如果需要,您可以从中提取城市字符串:

    @OneToOne(optional = false)
    private Airport airport_source;
    

    【讨论】:

    • 现在我明白了这个问题。实体之间的关系必须始终在实体之间,而不是实体和普通对象之间。
    • 好的...现在表已正确创建,但现在我在 ROUTE 表中有两个字段:AIRPORT_CITY_DEST_AIRPORT_ID 和 AIRPORT_CITY_SOURCE_AIRPORT_ID。那些让我能够到达正确的机场。但是不存在通过城市名称而不是 id 到达机场的方法吗?
    • 不,不在 JPA 中。 ID 唯一标识一个机场,而不是城市。一个城市可以有多个机场,因此这涵盖了您。如果机场中的城市名称是唯一的,请将其设为 ID/主键,而不是使用数字 aiport_id 字段。或者查询具有特定城市名称的机场,并处理代码中的重复项。
    • 好的,我现在已经明白了一切。非常感谢克里斯 幸运的是,一个城市可以拥有多个机场。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2021-04-14
    • 2022-01-05
    相关资源
    最近更新 更多