我有一个名为itineraryTraveller的实体,每个itineraryTraveller可以有多个flightEntity。当我尝试从数据库中删除itineraryTraveller(父)时,出现以下错误消息:

a foreign key constraint fails (`pquino01db`.`ITINERARYTRAVELLER_FLIGHTENTITY`, CONSTRAINT `FK_ITINERARYTRAVELLER_FLIGHTENTITY_flights_ID` FOREIGN KEY (`flights_ID`) REFERENCES `FLIGHTENTITY` (`ID`))"


这是我的itineraryTraveller实体:

@Entity
public class itineraryTraveller implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<flightEntity> flights;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date departureDate;

    private String departureLocation;
    private String arrivalLocation;
    private double cost;
    private char status;
    private ArrayList<String> stops;
    private String stopPrint;
    private String userName;
    private int iden;

    // ...
}


flightEntity看起来像这样:

@Entity
public class flightEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Temporal(javax.persistence.TemporalType.DATE)
    private Date departureDate;

    private String airlineCode;
    private String flightNumber;
    private String departureLocation;
    private String arrivalLocation;
    private double businessCost;
    private double economyCost;
    private int numBusinessSeats;
    private int numEconomySeats;

    // ...
}


有人可以看到问题吗?我认为我的@OneToMany批注可能缺少某些内容,但是我不确定是什么。我想同时删除父母和孩子。

最佳答案

您在两个实体之间的关系是单向的,因为在flightEntity上没有itineraryTraveller,因此没有从@JoinColumn映射回flightEntity实体的映射。对于您的问题,可以有以下解决方案之一:


@ManyToOne上添加flightEntity注释,如下所示:

@Entity
public class flightEntity implements Serializable {
   // ....

   @ManyToOne
   @JoinColumn(name="<name_of_foreignkey_column>")
   private itineraryTraveller traveller;

   // ...
}


并且您必须在mappedBy批注中添加@OneToMany属性:

@OneToMany(mappedBy="traveller", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)


从而使实体之间的关系是双向的。


如果数据库中已经有具有外键关系的表,则可以解决此问题。


@JoinTable注释上使用@OneToMany注释:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name="<join_table_name>", joinColumns=@JoinColumn("TRAVELLER_ID"), inverseJoinColumns=@JoinColumn("FLIGHT_ID"))
private List<flightEntity> flights;



(这些列的名称被视为示例,可以更改。)

如果您的数据库中没有定义外键列的表,那么最后一个映射很有用,它将创建一个新表作为表之间的关联;在多对多关系中通常是这种情况。

如果可能,请在flights实体上使用@ManyToOne注释。这是映射一对多关系的正常方法。

最后,Java中有约定,状态类名称应以大写字母开头。因此,我将实体名称重命名为FlightItineraryTraveller

07-26 09:30