删除子项时删除父项(Unidirectional OneToOne)

时间:2014-03-30 18:18:10

标签: hibernate jpa playframework playframework-1.x one-to-one

我有一个名为Photo的模型类,以及其他几个代表不同类型照片源的类。 Photo类必须保持其源类的不可知性,因此,就目前而言,我已将该关系表示为源的一侧的单向OneToOne:

@Entity
public class Photo extends Model {
    ...
}

@Entity public class InstagramPhoto extends PhotoSource {       
    @Id     
    public String id;   
}

@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class PhotoSource extends GenericModel {
    @OneToOne(cascade=CascadeType.REMOVE)
    public Photo photo;
}

如果删除InstagramPhoto实例,其关联的Photo实例也会被删除。然而,相反的操作引发了异常。我无法删除Photo实例。它给了我以下错误:

Referential integrity constraint violation: "FK9366567567B45F0BDBD6: PUBLIC.INSTAGRAMPHOTO FOREIGN KEY(PHOTO_ID) REFERENCES PUBLIC.PHOTOS(ID) (4)";

P.S。虽然,我不想将Photo与PhotoSource联系起来,但我也尝试了另一个@OneToOne。然后,代码无法编译,表示无法与PhotoSource.photo建立mappedBy关系。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

您可以更改Photo类以反映与PhotoSource类的关联。然后你将级联选项添加到Photo,这将删除相关的Photo。

类似的东西:

@Entity
public class Photo extends Model {
    @OneToOne(cascade=CascadeType.REMOVE)
    public PhotoSource photoSource;
}

请记住,这需要反映您的数据库模型。如果您不想将Photo与PhotoSource相关联,则可能需要手动删除相关行。

答案 1 :(得分:0)

我通过在@MappedSuperclass中与@Entity交换PhotoSource并在其中移动ID定义来解决此问题

答案 2 :(得分:-1)

您还可以尝试cascade = CascadeType.ALL它会照顾save, delete, update, evict, lock, replicate, merge, persist与孩子和父母之间的关系。希望有所帮助。