JPA,三个实体,它们的关系。 CascadeType正确删除?

问题描述:

我有这三个实体,在DB中有自己的表。主要实体是WearableJob。请记住,此代码中设置的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; 

} 

然后我想嘱咐WearableJob之间的关系(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而不删除WearableJob,那么在所有这些字段中我必须设置哪些类型的级联?我尝试了所有的组合,并且在某些情况下我删除了所有的(WSub,W和J),而在其他情况下,当我执行删除时,什么都没有发生,所有(WSub,W和J)仍然在数据库中。

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

如果你想级联是删除操作,不传递CascadeType.ALL(因为它包括CascadeType.REMOVE),也不CascadeType.REMOVE

级联从包含其他实体的实体发生。由于您的WearableSubscription是一个关系实体,因此您可能不想级联对其进行的操作,因为这些更改只与关系有关,而与实体本身无关。

所以,在你WearableSubscription类你想同时JobWearable有没有级联的设置,并保留其他类原样。

希望这会有所帮助。