在我的应用程序中,我想将应用程序中的所有图像放在一张表中。我上次发布了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
,当我保存Product
或Promotion
时,关联的Image(s)
也被保存了,这很酷,这正是我想要的。
B)
我现在遇到的主要问题是,当我删除Product
或Promotion
时,其关联的图像永远不会被删除。它们的关联图像位于图像表中。
我希望通过使用cascade=CascadeType.ALL
删除Product
或Promotion
时,其图像也应自动删除。我尝试从数据库中删除图像,如果它会触发其关联的Product
或Promotion
删除,但是我没有这样做,因为我认为这是单向的,这很有意义。但是,当我删除Product
或Promotion
时,与其关联的图像不会被删除的原因
答案 0 :(得分:0)
在两个关系中添加orphanRemoval = true
:
@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true)
这将
将删除操作应用于已从删除的实体 关系,并将删除操作级联到这些实体。