【问题标题】:Delete the parent, when the child gets deleted (Unidirectional OneToOne)删除父级,当子级被删除时(单向 OneToOne)
【发布时间】:2014-03-30 18:18:09
【问题描述】:

我有一个名为 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 实例也会被删除。然而,相反的操作会引发异常。我无法删除照片实例。它给了我以下错误:

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

附:虽然,我不希望将照片与 PhotoSource 相关联,但我也尝试过,使用另一个 @OneToOne。然后,代码没有编译,说不能建立与 PhotoSource.photo 的 mappedBy 关系。

我能做什么?

【问题讨论】:

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


    【解决方案1】:

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

    类似:

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

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

    【讨论】:

      【解决方案2】:

      我通过在PhotoSource 中将@MappedSuperclass@Entity 交换并将id 定义移到那里解决了这个问题

      【讨论】:

        【解决方案3】:

        你也可以试试cascade = CascadeType.ALLsave, delete, update, evict, lock, replicate, merge, persist处理孩子和父母的关系。希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2021-12-02
          • 2013-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-28
          • 1970-01-01
          相关资源
          最近更新 更多