Hibernate @OneToMany映射-删除记录的问题

时间:2018-08-17 21:53:51

标签: java hibernate jpa hibernate-mapping

在我的应用程序中,我想将应用程序中的所有图像放在一张表中。我上次发布了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;
}

现在面临的问题是:

A) 当我在 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时,与其关联的图像不会被删除的原因

1 个答案:

答案 0 :(得分:0)

在两个关系中添加orphanRemoval = true

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

这将

  

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