【问题标题】:Delete both parent and child in @OneToMany relationship删除@OneToMany 关系中的父子关系
【发布时间】:2016-09-03 06:22:26
【问题描述】:

我有一个名为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 注释可能丢失了一些东西,但我不确定是什么。我想同时删除父母和孩子。

【问题讨论】:

标签: java jpa


【解决方案1】:

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

  1. flightEntity上添加@ManyToOne注解如下:

    @Entity
    public class flightEntity implements Serializable {
       // ....
    
       @ManyToOne
       @JoinColumn(name="<name_of_foreignkey_column>")
       private itineraryTraveller traveller;
    
       // ...
    }
    

    你必须在你的@OneToMany注解中添加一个mappedBy属性:

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

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

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

  1. @OneToMany注解上使用@JoinTable注解:

    @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;
    

(列名被认为是示例,可以更改。)

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

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

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

【讨论】:

  • 谢谢!!我正在使用 2 解决方案。但它没有找到“TRAVELLER_ID”,也没有找到“FLIGHT_ID”。我应该在哪里设置这些列名称?
  • TRAVELLER_IDFLIGH_ID 是我选择的名称。但是在您的情况下,您必须在数据库中查找正确的列名。您是否有一个包含两个表的主键的关联表?
  • 问题是我希望我的应用程序自动在数据库中创建所有表。所以我宁愿不从数据库中操作。与首次部署应用程序时一样,这些表不会已经存在
  • 顺便说一句,我的目标是从数据库中删除一个 FlightEntity,然后自动删除包含该航班的所有 ItineraryTravellers 在其航班属性列表中
  • 我以为你已经在数据库中有表了。如果您想自动创建所有表,您选择哪种方式都没有关系。您只需告诉您的 JPA 提供者生成表,而且实际上只有在您第一次部署应用程序时。
【解决方案2】:

请注意,在某些情况下,子对象上的 @JoinColumn 必须具有 insertable = false 和 updatable = false ,如下所示: @JoinColumn(name = "user_id", insertable = false, updatable = false)

public class User {
   private List<UserRole>   roles;

   @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, mappedBy = "user")
   public List<UserRole> getRoles() {
      return this.roles;
   }
   public void setRoles(List<UserRole> roles) {
       this.roles = roles;
   }

}

public class UserRole {
    @ManyToOne
    @JoinColumn(name = "user_id", insertable = false, updatable = false)
    private User user;
}

【讨论】:

    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多