Hibernate 删除父级,当子级被删除时(单向OneToOne)
我有一个名为Photo的模型类和其他几个类,它们表示不同类型的照片源。Photo类必须保持其源类的不可知性,因此现在,我将关系表示为源的一侧的单向OneToOne:Hibernate 删除父级,当子级被删除时(单向OneToOne),hibernate,jpa,playframework,playframework-1.x,one-to-one,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; } @Mapped
@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实例,其关联的照片实例也会被删除。但是,相反的操作会引发异常。我无法删除照片实例。它给了我以下错误:
Referential integrity constraint violation: "FK9366567567B45F0BDBD6: PUBLIC.INSTAGRAMPHOTO FOREIGN KEY(PHOTO_ID) REFERENCES PUBLIC.PHOTOS(ID) (4)";
另外,虽然我不想把照片和一个光源联系起来,但我也试过了,用另一个@OneToOne。然后,代码不编译,表示无法创建与PhotoSource.photo的mappedBy关系
我能做什么?您可以更改Photo类以反映与PhotoSource类的关联。然后将级联选项添加到照片中,这也将删除相关照片 比如:
@Entity
public class Photo extends Model {
@OneToOne(cascade=CascadeType.REMOVE)
public PhotoSource photoSource;
}
请记住,这需要反映您的数据库模型。如果您不想将照片与PhotoSource关联,您可能需要手动删除相关行。您也可以尝试
cascade=CascadeType。所有的它负责孩子和父母之间的保存、删除、更新、逐出、锁定、复制、合并、持久化。希望能有所帮助。我通过在PhotoSource
中将@MappedSuperclass
与@Entity
交换,并将id定义移到那里,解决了这个问题