删除多对多关系中的所有内容 (JPA)
delete everything in a many-to-many relationship (JPA)
我有以下模型(简化):
@Entity
public class Video {
@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name = "video_tag", joinColumns = {
@JoinColumn(name = "video_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "tag_id", referencedColumnName = "id") })
private Set<Tag> tags;
}
@Entity
public class Tag {
@ManyToMany(mappedBy="tags", fetch=FetchType.LAZY)
private Set<Video> videos;
}
我有一个数据库,其中视频连接到多个标签,反之亦然。我想删除所有视频并将其级联以删除所有标签。在 Video 实体上调用 remove 会导致一个循环,在标记和视频之间来回循环几轮之后,java 编译器会打印循环的堆栈转储。
如何使用 JPA 删除视频/所有视频,最好是删除所有视频并将删除级联到标签。
操作是:
- 分解关系(对象模式)
- 更新所有者实体(本例中为视频)
删除视频实体也会删除标签实体,因为视频中的级联注释 Class。
//Remove relationships
List<Video> videoList;
for (Video v : videoList) {
for(Tag t : video.getTags()){
t.getVideos.remove(v);
v.getTags.remove(t);
}
}
//Update owner entities
for (Video v : videoList) {
Session sess = HibernateUtil.getSessionFactory().openSession();
Transaction tx = sess.beginTransaction();
sess.update(v);
tx.commit();
sess.close();
}
//Remove owner entities
for (Video v : videoList) {
Session sess = HibernateUtil.getSessionFactory().openSession();
Transaction tx = sess.beginTransaction();
sess.delete(v);
tx.commit();
sess.close();
}
我有以下模型(简化):
@Entity
public class Video {
@ManyToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@JoinTable(name = "video_tag", joinColumns = {
@JoinColumn(name = "video_id", referencedColumnName = "id") }, inverseJoinColumns = {
@JoinColumn(name = "tag_id", referencedColumnName = "id") })
private Set<Tag> tags;
}
@Entity
public class Tag {
@ManyToMany(mappedBy="tags", fetch=FetchType.LAZY)
private Set<Video> videos;
}
我有一个数据库,其中视频连接到多个标签,反之亦然。我想删除所有视频并将其级联以删除所有标签。在 Video 实体上调用 remove 会导致一个循环,在标记和视频之间来回循环几轮之后,java 编译器会打印循环的堆栈转储。
如何使用 JPA 删除视频/所有视频,最好是删除所有视频并将删除级联到标签。
操作是:
- 分解关系(对象模式)
- 更新所有者实体(本例中为视频)
删除视频实体也会删除标签实体,因为视频中的级联注释 Class。
//Remove relationships List<Video> videoList; for (Video v : videoList) { for(Tag t : video.getTags()){ t.getVideos.remove(v); v.getTags.remove(t); } } //Update owner entities for (Video v : videoList) { Session sess = HibernateUtil.getSessionFactory().openSession(); Transaction tx = sess.beginTransaction(); sess.update(v); tx.commit(); sess.close(); } //Remove owner entities for (Video v : videoList) { Session sess = HibernateUtil.getSessionFactory().openSession(); Transaction tx = sess.beginTransaction(); sess.delete(v); tx.commit(); sess.close(); }