【问题标题】:Hibernate @OneToMany Mapping - issues with deleting recordsHibernate @OneToMany 映射 - 删除记录的问题
【发布时间】:2018-08-17 21:53:50
【问题描述】:

在我的应用程序中,我想将应用程序中的所有图像放在一个表中。我上次发了question,有人建议我使用单向 @OneToMany

我有以下与Image 实体关联的实体

@Entity
@Table(name="promotion")
public class Promotion {

    @Id
    @Column(name="id")
    protected String id;

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="itemId")
    protected List<Image> images = new ArrayList<>(); 
}


@Entity
@Table(name="product")
public class Product {

    @Id
    @Column(name="id")
    protected String id;

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="itemId")
    protected List<Image> images = new ArrayList<>(); 
}


@Entity
@Table(name="image")
public class Image{

    @Id
    @Column(name="id")
    private String id = IdGenerator.createId();

    @Column(name="itemId")
    private String itemId;

    @Column(name="title", nullable = false)
    protected String title;

    @Column(name="filename", nullable = false)
    protected String filename;

    @Column(name="path", unique = true)
    private String path;

    @Column(nullable = true)
    protected int width;

    @Column(nullable = true)
    protected int height;
}

现在面临的问题是:

一) 当我在 images ArrayList 属性上使用 cascade={CascadeType.PERSIST, CascadeType.MERGE} 时,我得到了这个异常:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

所以我用cascade=CascadeType.ALL 替换它,当我保存ProductPromotion 时,关联的Image(s) 也被保存,这很酷,这就是我想要的

B) 我现在遇到的主要问题是当我删除ProductPromotion 时,其关联的图像永远不会被删除。他们的关联图像保留在 图像 表中。

通过使用cascade=CascadeType.ALL,我希望当我删除ProductPromotion 时,它的图像也应该被自动删除。我试图从数据库中删除一个图像,如果它会触发其关联的ProductPromotion 被删除,但它没有因为我认为它是单向的,这是有道理的。但是,当我删除 ProductPromotion 时,它的相关图像怎么不会被删除

【问题讨论】:

  • 嗨,艾迪。我是这里的志愿者编辑,为了便于阅读,我已经修改了你的一些帖子。如果您可以查看我所做的编辑并阅读编辑消息,那就太好了,这样您将来就可以避免这些问题。您可能不知道,但这里的问题+答案并非主要针对问题作者 - 它们是针对您问题的数百名未来读者。考虑到这一点,我们希望帖子尽可能具有可读性。
  • 根据您的写作风格,我会向您推荐两个项目。首先,无需添加感谢和赞赏以及其他闲聊材料-请keep it succinct。其次,请遵守英语的通常大小写规则;特别是,当称自己为“我”时,它始终是大写字母。你认为你可以在未来的材料中对这两件事做一些小的调整吗?它会为我和其他编辑节省一些工作。

标签: java hibernate jpa hibernate-mapping


【解决方案1】:

在两个关系中添加orphanRemoval = true

@OneToMany(cascade = CascadeType.ALL,
            fetch = FetchType.EAGER,
            orphanRemoval = true)

这会

将删除操作应用于已从 关系并将删除操作级联到这些实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2012-02-08
    相关资源
    最近更新 更多