JPA,三个实体,它们的关系。 CascadeType正确删除?
问题描述:
我有这三个实体,在DB中有自己的表。主要实体是Wearable
和Job
。请记住,此代码中设置的CascadeType是错误的。JPA,三个实体,它们的关系。 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;
}
然后我想嘱咐Wearable
和Job
之间的关系(WearableSubscription
)。可穿戴设备可以有很多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
而不删除Wearable
和Job
,那么在所有这些字段中我必须设置哪些类型的级联?我尝试了所有的组合,并且在某些情况下我删除了所有的(WSub,W和J),而在其他情况下,当我执行删除时,什么都没有发生,所有(WSub,W和J)仍然在数据库中。
答
正如您在Cascade Type上看到的那样,您可以将大量值作为数组传递给cascade
参数。
如果你想不级联是删除操作,不传递CascadeType.ALL
(因为它包括CascadeType.REMOVE
),也不CascadeType.REMOVE
。
级联从包含其他实体的实体发生。由于您的WearableSubscription
是一个关系实体,因此您可能不想级联对其进行的操作,因为这些更改只与关系有关,而与实体本身无关。
所以,在你WearableSubscription
类你想同时Job
和Wearable
有没有级联的设置,并保留其他类原样。
希望这会有所帮助。