Java JPA,三个实体,它们之间的关系¿;是否正确删除的级联类型?

Java JPA,三个实体,它们之间的关系¿;是否正确删除的级联类型?,java,sql,spring,hibernate,jpa,Java,Sql,Spring,Hibernate,Jpa,我有这三个实体,它们在数据库中有自己的表。主要实体是可穿戴和作业。请记住,此代码中设置的级联类型是错误的 @Entity public class Wearable { @Id private String mac; @OneToMany(mappedBy = "wearable") private List<Job> jobs; @OneToMany(mappedBy = "wearable", cascade = {CascadeType.ALL})

我有这三个实体,它们在数据库中有自己的表。主要实体是
可穿戴
作业
。请记住,此代码中设置的级联类型是错误的

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

}
}

所以在这一点上,我不知道CascadeType是如何工作的。我的意思是,如果我想删除
可穿戴订阅
,而不删除
可穿戴
作业
,那么我必须在所有这些字段中设置什么类型的级联?我正在尝试所有的组合,在某些情况下,我会删除所有(WSub,W和J),而在其他情况下,当我执行删除操作时,什么都不会发生,所有(WSub,W和J)仍在数据库中。

正如您在上所看到的,您有大量的值可以作为数组传递给
cascade
参数

如果您只想级联删除操作,则不要传递
CascadeType.all
(因为它包括
CascadeType.REMOVE
)或
CascadeType.REMOVE

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

因此,在您的
WearableSubscription
类中,您希望
Job
WearableSubscription
都没有级联设置,而其他类保持不变

希望这能有所帮助。

正如您在上所看到的,您有大量的值可以作为数组传递给
级联
参数

如果您只想级联删除操作,则不要传递
CascadeType.all
(因为它包括
CascadeType.REMOVE
)或
CascadeType.REMOVE

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

因此,在您的
WearableSubscription
类中,您希望
Job
WearableSubscription
都没有级联设置,而其他类保持不变

希望这有帮助

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