JPA,三个实体,他们的关系。 ¿用于正确删除的CascadeType?

时间:2017-10-10 08:42:04

标签: java sql spring hibernate jpa

我有这三个实体,它们在数据库中有自己的表。主要实体是WearableJob。请记住,此代码中设置的CascadeType是错误的。

@Entity
public class Wearable {

  @Id
  private String mac;

  @OneToMany(mappedBy = "wearable")
  private List<Job> jobs;

  @OneToMany(mappedBy = "wearable", cascade = {CascadeType.ALL})
  private List<WearableSubscription> subscriptions;

}


@Entity
public class Job {

  @Id
  private String id;

  @OneToOne(mappedBy = "job", cascade = CascadeType.ALL)
  private WearableSubscription wearableSubscription;

}

然后我想在WearableSubscriptionWearable之间建立关系(Job)。可穿戴设备可以包含多个WearableSubscription,但此WearableSubscription中只有一个可以有一个Job

@Entity
public class WearableSubscription {

  private WearableSubscriptionId id;

  @OneToOne (cascade = {CascadeType.ALL, CascadeType.PERSIST})
  @JoinColumn(name = "job_id", insertable = false, updatable = false)
  private Job job;

  @ManyToOne(cascade = {CascadeType.ALL, CascadeType.PERSIST})
  @JoinColumn(name = "wearable_mac", insertable = false, updatable = false)
  private Wearable wearable;

  private String message;
  private String imageUrl;
  private String audioUrl;

}

所以在这一点上,我并不确切知道CascadeType是如何工作的。我的意思是,如果我要删除WearableSubscription而不删除WearableJob,我必须在所有这些字段中设置哪种类型的级联?我正在尝试所有组合,在某些情况下我删除所有(WSub,W和J),而在其他情况下,当我执行删除时,没有任何事情发生,所有(WSub,W和J)仍然在数据库中。

1 个答案:

答案 0 :(得分:0)

正如您在Cascade Type上看到的那样,您可以将大量值作为数组传递给cascade参数。

如果你想要 NOT 级联是DELETE操作,请不要通过CascadeType.ALL(因为它包括CascadeType.REMOVE)和CascadeType.REMOVE

级联发生在包含其他实体的实体中。由于您的WearableSubscription是一个关系实体,您可能不希望对其进行级联操作,因为更改仅与关系有关,而与实体本身无关。

因此,在WearableSubscription课程中,您希望JobWearable都没有级联设置,并保留其他课程。

希望这有帮助。