1
我有@ManyToMany
關係Author
和Source
實體,其中Author
是擁有實體。當我刪除作者時,一切正常,休眠生成Hibernate: delete from author_source where author=?
。但是,當我刪除源,Hibernate生成相同的查詢authorId
author_source
表中每個出現與刪除的源連接。因此,此查詢還會刪除其他來源之間的連接(如果作者有兩個來源,則兩個連接都將被刪除)。Hibernate @ManyToMany只使用擁有表中的FK來刪除連接表中的條目
作者單位:
@Entity
@Table(name = "author")
public class Author implements Serializable {
@Id
@Column(name = "authorId")
@GeneratedValue
private Integer authorId;
@SourceFormat // own formatter
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "author_source",
joinColumns = { @JoinColumn(name = "author") },
inverseJoinColumns = { @JoinColumn(name = "source") }
)
private Set<Source> sources;
}
源實體:
@Entity
@Table(name = "source")
public class Source implements Serializable {
@Id
@Column(name = "sourceId")
@GeneratedValue
private Integer sourceId;
@ManyToMany(fetch = FetchType.EAGER, mappedBy = "sources")
private Set<Author> authors;
}
我想Hibernate的生成
delete from author_source where author=?
查詢時,我刪除作者,
delete from author_source where source=?
當我刪除源。是否可以或應該手動執行?
您確定'CascadeType.DELETE_ORPHAN'?它只是刪除所有與任何作者無關的來源。 (試用'@Cascade(CascadeType.DELETE_ORPHAN)') – kurochenko
Kurochenko:是不是你想要達到的目標?當您刪除作者時,與該作者相關的所有來源將成爲孤兒並將被刪除。但是,當您刪除源並且作者有其他子源時,作者將不會被刪除,這是我的要求。 –
好吧,不。我可能錯誤地解釋了ID。當我刪除作者時,Hibernate根據author_source.author從author_source中刪除(並且保持源表不變)。沒關係。但是當我刪除源代碼時,它也會根據author_source.author從author_source中刪除,而不是根據author_source.source(請參閱上述生成的SQL命令)。這可能會導致作者和其他來源之間的連接被不必要地移除。 – kurochenko