我有一个名为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关系。
我该怎么办?
答案 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
与孩子和父母之间的关系。希望有所帮助。